详解class继承的坑(私有属性无法被子类使用问题)

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

猜你喜欢

转载自blog.csdn.net/weixin_43695002/article/details/124382536