【发布时间】:2011-05-04 04:57:46
【问题描述】:
我在 javascript 中遇到过原型继承。
我想要实现的是方法的大纲,当被继承时必须实现/定义。
我想知道这是否可行,如果可行,如何实现。
【问题讨论】:
标签: javascript inheritance prototype
我在 javascript 中遇到过原型继承。
我想要实现的是方法的大纲,当被继承时必须实现/定义。
我想知道这是否可行,如果可行,如何实现。
【问题讨论】:
标签: javascript inheritance prototype
JavaScript 真的没有这样的东西。正如你所说,JavaScript 是prototype-oriented。
正如其他答案所说,当然,你可以模拟这个。但我看不出这样做的充分理由。为什么面向对象的程序员使用接口和抽象类? Astraction 和 decoupling。这些允许您做各种好事,例如编写消耗(作为参数)和产生(返回)具有抽象类型的值的方法 - 对象将至少满足有关其方法的某些约定和字段。
反过来,我们得到了其他“好东西”,例如类型安全的编译时检查。尝试将 Foo 类型的对象传递给只接受 Bar* 类型的对象的方法,您将收到编译器警告。
prototype 或 constructor(阅读:new),但您可以更改对象的属性。听起来您正试图将强类型、面向对象的语言的相对刚性强加到 JavaScript 的“宽松、随波逐流”的动态类型系统上。恕我直言,这不是一个好主意。也许您可以解释一下您要解决的实际问题?
对不起,如果这是冗长的,咆哮的,或不连贯的。我敢肯定,至少有一种语言 (OCaml?) 完全颠覆了我的逻辑。给我一些反馈。
*当然,假设Foo 不是Bar 的子类型。
† ...但仅在运行时,所以它实际上并不能比 JavaScript 的类型系统已经获得的保证更多。
‡ 因此可能
【讨论】:
Javascript 不支持开箱即用,但很容易模拟所需的语义。如果您有一个想要抽象的基“类”,请将抽象的方法放在上面,并让它们抛出错误。如果用户扩展了您的“类”并且没有提供实现,则会引发错误。例如,你可以这样做
function Thing() {...}
Thing.prototype.abstractMethod = function() {
throw 'You must implement abstractMethod';
}
【讨论】: