javascript - ES6静态成员被子类继承

标签 javascript es6-class

我发现类的静态成员由 JavaScript 中的子类继承。我已经使用 Chrome 67.0.3396.62、FireFox 60.0.1 和 NodeJS 10.1.0.

但是在 OOP 中,静态成员和字段应该属于类而不是被继承,这不是很奇怪吗?

这是 JavaScript extends 的错误吗?

class A {
  static a () {
    console.log('==[static a]==')
  }
}

A.propA = { anything: '==[static data from A]==' }

class B extends A { }

console.log(B.a()) // "==[static a]=="
console.log(B.propA.anything) // "==[static data from A]=="

最佳答案

Is it a bug for JavaScript extends?

不,它完全按照设计工作。

So where did class B actually find its inherited propA property? Through which part of the prototype chain?

让我们首先澄清两件事:

  • 函数是对象,这意味着它们有一个原型(prototype)。默认情况下是 Function.prototype,它是定义 .call.apply 等方法的地方。
  • “静态成员”只是函数对象的属性

做的时候

class B extends A {}

然后为 B 创建一个新的函数对象,其原型(prototype)值为 A,而不是 Function.prototype,因此A 的所有属性都可以通过 B 访问。

我们可以轻松验证这一点:

class A {}
class B extends A {}
console.log(Object.getPrototypeOf(B) === A);

关于javascript - ES6静态成员被子类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50713575/

相关文章:

javascript - 有没有更好的方法在 React Component 类中绑定(bind) 'this'?

javascript - 将 Apache Thrift JS 绑定(bind)与 Backbone.js 结合使用的方法?

javascript - Javascript 中的查找/替换任务

当事件只发生一次时,JavaScript 事件被触发两次

Javascript - 从数组中删除值 - 构造时间数组

javascript - 如何在 AngularJS 中为多个 Promise 提供单个最终处理程序?

javascript - ES6 类中的继承和原型(prototype)链

javascript - ES6 类实例变量是如何工作的

javascript - 在 javascript 库中的导出类之外声明函数是实现私有(private)函数的好习惯吗?

javascript - Photoshop 中的类构造函数