为了账号安全,请及时绑定邮箱和手机立即绑定

如何扩展从 ES6 中的父类继承的类属性?

如何扩展从 ES6 中的父类继承的类属性?

繁星coding 2021-11-12 16:46:40
我有以下代码:class Parent {    some_class_property = [1,2,3];    some_other_methods(){...}}class Child extends Parent {    some_class_property = super.some_class_property.push(4);}控制台给我一个语法错误,说关键字super是意外的。如果 ES6 中允许类属性,那么不允许它在子类中扩展又有什么意义呢?如果这不是正确的方法,那么该怎么做?谢谢。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

看起来super类字段中不允许引用,这就是您当前代码抛出错误的原因。


但是,在超类构造函数中将some_class_property放在实例化对象本身上(好吧,在类字段中,这是将它放在超类构造函数中的对象上的有效语法糖),这意味着您可以在子类中引用它参考this.some_class_property. 您没有引用隐藏的方法或属性,因此super不需要:


class Parent {

  some_class_property = [1, 2, 3];

}


class Child extends Parent {

  some_class_property = this.some_class_property.push(4)

}


const c = new Child();

console.log(c.some_class_property);


还要记住,.push返回数组的新长度,这就是为什么上面代码片段的结果是4. (如果您想复制some_class_property数组,无论出于何种原因,请改用some_class_property = [...this.some_class_property, 4])


使用的时间super是当子实例或子原型上存在属性,但您想引用父原型上的属性时,例如:


class Parent {

  method() {

    console.log('parent method');

  }

}


class Child extends Parent {

  method() {

    console.log('child method');

  }

  invokeParentMethod() {

    super.method();

  }

}


const c = new Child();

c.method();

c.invokeParentMethod();



查看完整回答
反对 回复 2021-11-12
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

公共和私有属性是处于实验阶段(ES11?)的 Javascript 特性。在 ES6 的过去几年中,人们一直在这样做:


class Parent {

    constructor(x){

        this.property1 = [1,2,3];

        ...

    }

    some_other_methods(){...}

}

Parent.property2 = [4,5,6];                 // to access: Parent.property1

Parent.prototype.property3 = [7,8,9];       // to access: obj.property2


class Child extends Parent {

    constructor(x){

        super(x);

        // ...

    }

    some_other_methods(){...}

}


查看完整回答
反对 回复 2021-11-12
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信