ES6静态成员由子类继承

时间:2018-06-06 06:30:07

标签: 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]=="




2 个答案:

答案 0 :(得分:1)

  

这是JavaScript extends的错误吗?

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

  

那么类B实际上在哪里找到了它继承的propA属性?通过原型链的哪一部分?

首先让我们澄清两件事:

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

做的时候

class B extends A {}

然后创建B的新函数对象,其值为A作为其原型,而不是Function.prototype,因此A的所有属性都可通过B

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



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




答案 1 :(得分:0)

这是一个非常好的link,可以理解静态如何使用以下代码作为示例。

class Triple {
  static triple(n) {
    if (n === undefined) {
      n = 1;
    }
    return n * 3;
  }
}

class BiggerTriple extends Triple {
  static triple(n) {
    return super.triple(n) * super.triple(n);
  }
}

console.log(Triple.triple());        // 3
console.log(Triple.triple(6));       // 18

var tp = new Triple();

console.log(BiggerTriple.triple(3));
// 81 (not affected by parent's instantiation)

console.log(tp.triple());
// 'tp.triple is not a function'.

直接回答你的问题:

  

静态方法调用直接在类上进行,并且在类的实例上不可调用。静态方法通常用于创建效用函数。