1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

docs(class): 删除错误描述(in 运算符判断继承的私有属性)

This commit is contained in:
ruanyf 2024-05-22 12:24:13 +08:00
parent 9324fdabef
commit 9c0896c683

View File

@ -871,46 +871,6 @@ class A {
上面示例中,私有属性`#foo`没有声明,就直接用于`in`运算符的判断,导致报错。 上面示例中,私有属性`#foo`没有声明,就直接用于`in`运算符的判断,导致报错。
子类从父类继承的私有属性,也可以使用`in`运算符来判断。
```javascript
class A {
#foo = 0;
static test(obj) {
console.log(#foo in obj);
}
}
class SubA extends A {};
A.test(new SubA()) // true
```
上面示例中,`SubA`从父类继承了私有属性`#foo``in`运算符也有效。
注意,`in`运算符对于`Object.create()``Object.setPrototypeOf`形成的继承,是无效的,因为这种继承不会传递私有属性。
```javascript
class A {
#foo = 0;
static test(obj) {
console.log(#foo in obj);
}
}
const a = new A();
const o1 = Object.create(a);
A.test(o1) // false
A.test(o1.__proto__) // true
const o2 = {};
Object.setPrototypeOf(o2, a);
A.test(o2) // false
A.test(o2.__proto__) // true
```
上面示例中,对于修改原型链形成的继承,子类都取不到父类的私有属性,所以`in`运算符无效。
## 静态块 ## 静态块
静态属性的一个问题是,如果它有初始化逻辑,这个逻辑要么写在类的外部,要么写在`constructor()`方法里面。 静态属性的一个问题是,如果它有初始化逻辑,这个逻辑要么写在类的外部,要么写在`constructor()`方法里面。