详解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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值