可以在JS中使用Abstract类吗?

Mos*_*ted 14 javascript inheritance prototype

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

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

我想知道这是否可能,如果可行,如何.

Mat*_*all 25

JavaScript真的没有这样的东西.正如您所说,JavaScript是面向原型的.


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

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

现在进行实际解释

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

你究竟想做什么?

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

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


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

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

因此可能

  • @hvgotcodes呃......你看到Crockford在文章底部的注释,"我现在看到我早期尝试用JavaScript支持经典模型是一个错误." (4认同)
  • +1支持这样的论点,即在JavaScript中模拟强类型语言的概念可能不是一个好主意.故事的道德,不要试图像Java一样编写JavaScript. (2认同)

hvg*_*des 9

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

function Thing() {...}
Thing.prototype.abstractMethod = function() {
    throw 'You must implement abstractMethod';
}
Run Code Online (Sandbox Code Playgroud)