javascript - 可以在 JS 中有抽象类吗?

标签 javascript inheritance prototype

我在 javascript 中遇到过原型(prototype)继承。

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

我想知道这是否可行,如果可行,如何实现。

最佳答案

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


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

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

现在进行实际解释

  1. JavaScript 允许您将任何对象传递给任何函数。您在函数内部对该对象执行的操作可能会导致运行时错误 - 但没有什么可以阻止您传递任意参数,即使参数数量与函数声明的数量不同。
  2. JavaScript 变量没有明确的类型。当您仍然需要执行手动、显式类型检查时,“保证” 某些对象具有某些方法集有什么意义?
  3. 在 JavaScript 中,函数并不局限于从属于对象——它们是语言的一等公民,可以像对象一样使用。所以? 对象的函数可以在运行时改变。您可以向对象添加额外的函数,或从对象中删除它们(或隐藏原型(prototype)中的函数)。因此,虽然您无法在创建对象后真正更改对象的 prototypeconstructor(读作:new),但您可以更改对象的属性。
  4. 与第 2 点类似,没有办法保证函数返回什么,甚至根本无法保证函数会返回任何值。函数在 JavaScript 中不像在许多 OO 语言中那样具有显式声明的签名。

你到底想做什么?

这听起来像是您在尝试将强类型、面向对象语言的相对刚性强加到 JavaScript 的“宽松、随波逐流”的动态类型系统上。恕我直言,这不是一个好主意。也许您可以解释您要解决的实际问题?

抱歉,如果这是冗长的、咆哮的或语无伦次的。我确信至少有一种语言 ( OCaml? ) 完全颠覆了我的逻辑。给我一些反馈。


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

...但仅在运行时,因此它实际上并不能比您使用 JavaScript 的类型系统获得的保证更多。

因此可能

关于javascript - 可以在 JS 中有抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4082482/

相关文章:

javascript - 如何在 JavaScript 中用 “</p>” 替换字符串中所有出现的 “”?

c++ - 在 STL vector 的派生类中实现 move 语义

javascript - func.prototype.constructor 与 func 完全相同吗?

Javascript - 使用原型(prototype)将 HTMLCollection 转换为字符串

javascript - 扩展对象字面量

javascript - 苹果音乐 API 引用

javascript - Angularjs datepicker popup bootstrap-ui 在 View 中不起作用

javascript - 如何在WordPress中使用jQuery定期调用Ajax?

c++ - 私有(private)继承 vs 包含

c# - 与 Funcs 的组合是否优于继承以更改单个函数中的行为?