我发现类的静态成员在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]=="

答案 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'.
直接回答你的问题:
静态方法调用直接在类上进行,并且在类的实例上不可调用。静态方法通常用于创建效用函数。