Skip to content

静态属性和静态方法的继承 #1178

@Joel90

Description

@Joel90

23. Class的继承 这一章,第3小节 3. 静态属性和静态方法的继承
说到父类的静态成员,也会被子类继承,而且是通过浅拷贝实现,
这一点好像无法证实,可能存在错误?

按道理,子类可以通过原型链访问到父类的静态属性,例如 Son.__proto__ === Father 子类 Son 自身上没有的属性,会到父类上去找,所以应该没有必要通过浅拷贝再复制一份父类的静态属性。
MDN上(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static#description )也说 Public static fields are not reinitialized on subclasses, but can be accessed via the prototype chain. 在子类上不会重新初始化父类的静态属性,而是通过原型链访问。

另外,原文中的两个示例也无法说明是通过浅拷贝实现静态属性的继承,
第一个示例中, B.foo--; 相当于对 B.foo 进行了赋值,也就是给子类 B 增加了静态属性 foo ,所以才导致 A.fooB.foo 是两个彼此独立的属性。
第二个示例,可以通过原型链访问来解释,所以好像无法证实一定是子类浅拷贝了 foo 对象的内存地址吧。

我在Chrome浏览器控制台尝试了以下代码,看起来对于静态成员,应该是不存在继承的,也没有浅拷贝

class A {
  static m = 1;
  static foo = { n: 100 };
}
class B extends A {
  constructor() {
    super();
    console.log(A.hasOwnProperty('m'), A.m);
    console.log(A.hasOwnProperty('foo'), A.foo);
    console.log(B.hasOwnProperty('m'), B.m);
    console.log(B.hasOwnProperty('foo'), B.foo);
    A.m--;
    console.log(A.m);
    console.log(B.m);
  }
}

const b = new B();
A.foo.n--;

console.log(A.hasOwnProperty('m'), A.m);
console.log(A.hasOwnProperty('foo'), A.foo);
console.log(B.hasOwnProperty('m'), B.m);
console.log(B.hasOwnProperty('foo'), B.foo);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions