我在javascript中遇到了原型继承。
我想要实现的是方法概述,必须实现/定义何时继承。
我想知道这是否可能,如果可行,怎么做。
答案 0 :(得分:25)
JavaScript真的没有这样的东西。如你所说,JavaScript是prototype-oriented。
正如其他答案所说,当然,你可以模拟这个。但我看不出有这么好的理由。为什么面向对象的程序员使用接口和抽象类? Astraction和decoupling。这些允许你做各种好事,比如使用(作为参数)和生成(返回)具有抽象类型的值的写方法 - 至少满足关于其方法的某些契约的对象和田野。
反过来,我们得到其他“好东西”,如类型安全的编译时检查。尝试将类型为Foo
的对象传递给只接受Bar
*类型对象的方法,然后您将收到编译器警告。
prototype
或constructor
(读取:new
),但您可以更改对象的属性。听起来你正试图将强类型,面向对象语言的相对刚性强加到JavaScript的“轻松,顺其自然”的动态类型系统中。恕我直言,这不是一个好主意。也许你可以解释一下你想要解决的实际问题?
对不起,如果这是啰嗦,咆哮,或语无伦次。我确信那里至少有一种语言(OCaml?)完全抛弃了我的逻辑。给我一些反馈意见。
*当然,假设Foo
不是Bar
的子类型。
† ...但仅限于运行时,因此它实际上不再是您使用JavaScript类型系统所获得的保证。
‡因此可能
答案 1 :(得分:9)
Javascript不支持开箱即用,但很容易模拟所需的语义。如果你有一个想要抽象的基类'class',那就把它上面抽象的方法放在上面,让它们抛出一个错误。如果用户扩展了“类”并且未提供实现,则将引发错误。例如,你可以做
function Thing() {...}
Thing.prototype.abstractMethod = function() {
throw 'You must implement abstractMethod';
}