class的普通属性和方法可以被子类继承,但是在ECMAScript 6 入门中描述class继承时,原文是: 子类无法继承父类的私有属性,或者说,私有属性只能在定义它的 class 里面使用。
但是在class私有属性部分,又有原如下描述: 子类从父类继承的私有属性,也可以使用in运算符来判断。
classs私有属性继承
下面来看一个私有属性在子类中的使用的例子:
class A {
#foo = 0;
static test(obj) {
console.log(#foo in obj);
}
}
class SubA extends A {
constructor(){
super()
this.ccc=this.#foo
}
};
//这样定义子类,会报如下错误:
/*
Uncaught SyntaxError: Private field '#foo' must be declared in an enclosing class
(未捕获的语法错误:必须在封闭类中声明私有字段“#foo”)
*/
也就是在子类中使用父类私有属性的时候,并没有找到
下面检验子类是否继承了父类的私有属性:方法1
this.ccc=this.#foo 改为 console.log(this)
//新建实例后
new SubA()
以上是输出的内容,可以看到,子类继承了父类的私有属性#foo
下面检验子类是否继承了父类的私有属性:方法2(in 运算符来判断)
class A {
#foo = 0;
static test(obj) {
console.log(#foo in obj);
}
}
class SubA extends A {
};
A.test(new SubA()) // true
上面示例中,SubA从父类继承了私有属性#foo,in运算符也有效。
结论:
子类可以继承父类的私有属性,但是无法在定义的类(父类)之外去使用的,只有由子类调用父类对应的方法才能访问。(以下是使用方法)
class A {
#foo = 1;
test(obj) {
return this.#foo+1
}
}
class SubA extends A {
constructor(){
super()
console.log(this.test())
}
};
new SubA()//输出2