-
Notifications
You must be signed in to change notification settings - Fork 8.9k
Closed
Description
在 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.foo 和 B.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
Labels
No labels