我在 javascript 中遇到过原型(prototype)继承。
我想要实现的是方法的概述,当继承时必须实现/定义这些方法。
我想知道这是否可行,如果可行,如何实现。
最佳答案
JavaScript 真的没有这样的东西。正如你所说,JavaScript 是 prototype-oriented .
正如其他答案所说,当然,你可以模拟这个。但我看不出这样做的充分理由。为什么面向对象的程序员使用接口(interface)和抽象类? Astraction和 decoupling .这些允许你做各种各样的好事,比如编写消耗(作为参数)和产生(返回)具有抽象类型的值的方法 - 至少满足一些关于其方法的契约的对象和字段。
反过来,我们得到了其他“好东西”,比如类型安全的编译时检查。尝试将 Foo
类型的对象传递给只接受 Bar
* 类型对象的方法,您将收到编译器警告。
现在进行实际解释
- JavaScript 允许您将任何对象传递给任何函数。您在函数内部对该对象执行的操作可能会导致运行时错误 - 但没有什么可以阻止您传递任意参数,即使参数数量与函数声明的数量不同。
- JavaScript 变量没有明确的类型。当您仍然需要执行手动、显式类型检查时,“保证”† 某些对象具有某些方法集有什么意义?
- 在 JavaScript 中,函数并不局限于从属于对象——它们是语言的一等公民,可以像对象一样使用。所以? 对象的函数可以在运行时改变。您可以向对象添加额外的函数,或从对象中删除它们(或隐藏原型(prototype)中的函数)。因此,虽然您无法在创建对象后真正更改对象的
prototype
或constructor
(读作:new
),但您可以更改对象的属性。 - 与第 2 点类似,没有办法保证函数返回什么,甚至根本无法保证函数会返回任何值。函数在 JavaScript 中不像在许多 OO 语言中那样具有显式声明的签名。
你到底想做什么?
这听起来像是您在尝试将强类型、面向对象语言的相对刚性强加到 JavaScript 的“宽松、随波逐流”的动态类型系统上。恕我直言,这不是一个好主意。也许您可以解释您要解决的实际问题?
抱歉,如果这是冗长的、咆哮的或语无伦次的。我确信至少有一种语言 ( OCaml? ) 完全颠覆了我的逻辑。给我一些反馈。
*当然,假设 Foo
不是 Bar
的子类型。
† ...但仅在运行时,因此它实际上并不能比您使用 JavaScript 的类型系统获得的保证更多。
‡ 因此可能
关于javascript - 可以在 JS 中有抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4082482/