可以在JS中使用Abstract类吗?

时间:2010-11-02 21:59:18

标签: javascript inheritance prototype

我在javascript中遇到了原型继承。

我想要实现的是方法概述,必须实现/定义何时继承。

我想知道这是否可能,如果可行,怎么做。

2 个答案:

答案 0 :(得分:25)

JavaScript真的没有这样的东西。如你所说,JavaScript是prototype-oriented


正如其他答案所说,当然,你可以模拟这个。但我看不出有这么好的理由。为什么面向对象的程序员使用接口和抽象类? Astractiondecoupling。这些允许你做各种好事,比如使用(作为参数)和生成(返回)具有抽象类型的值的写方法 - 至少满足关于其方法的某些契约的对象和田野。

反过来,我们得到其他“好东西”,如类型安全的编译时检查。尝试将类型为Foo的对象传递给只接受Bar *类型对象的方法,然后您将收到编译器警告。

现在进行实际解释

  1. JavaScript允许您将任何对象传递给任何函数。你在函数内部使用该对象做什么可能会导致运行时错误 - 但是没有什么能阻止你传递任意参数,甚至是与函数声明的参数数量不同的参数。
  2. JavaScript变量没有显式类型。当你仍然需要进行手动,显式类型检查时,某些对象有一些方法可以“保证”有什么意义呢?
  3. 在JavaScript中,函数不会被卡在对象中 - 它们是语言的一等公民,并且可以像对象一样使用。所以? 对象的函数可以在运行时更改 您可以向对象添加其他函数,或者从对象中删除它们(或者在原型中隐藏函数)。因此,虽然您在创建后无法真正更改对象的prototypeconstructor(读取:new),但您可以更改对象的属性。
  4. 与第2点类似,无法保证函数返回的内容,甚至无法保证函数将返回任何值。函数在JavaScript中没有显式声明的签名,就像它们在许多OO语言中那样。
  5. 你究竟想做什么?

    听起来你正试图将强类型,面向对象语言的相对刚性强加到JavaScript的“轻松,顺其自然”的动态类型系统中。恕我直言,这不是一个好主意。也许你可以解释一下你想要解决的实际问题?

    对不起,如果这是啰嗦,咆哮,或语无伦次。我确信那里至少有一种语言(OCaml?)完全抛弃了我的逻辑。给我一些反馈意见。


    *当然,假设Foo不是Bar的子类型。

    ...但仅限于运行时,因此它实际上不再是您使用JavaScript类型系统所获得的保证。

    因此可能

答案 1 :(得分:9)

Javascript不支持开箱即用,但很容易模拟所需的语义。如果你有一个想要抽象的基类'class',那就把它上面抽象的方法放在上面,让它们抛出一个错误。如果用户扩展了“类”并且未提供实现,则将引发错误。例如,你可以做

function Thing() {...}
Thing.prototype.abstractMethod = function() {
    throw 'You must implement abstractMethod';
}