javascript - 从派生类访问基类的 protected 字段(ES2019 私有(private)类)

标签 javascript private ecmascript-next class-fields

我想从派生类访问基类的私有(private)字段而不将其公开(在其他语言中称为“ protected ”)。

考虑下面的类:

class Animal {

  #privateProp;

  constructor() {

  this.#privateProp = 12;

  }
}

现在是扩展类:

class Cat extends Animal {

  constructor() {

    super();
  }

  doIt() {

    console.log(this.#privateProp) // 1 below
    console.log(super.#privateProp) // 2 below
  }
}

我想像 protected 一样执行:

new Cat().doIt();

但得到(分别):

  1. Uncaught SyntaxError: Private field '#privateProp' must be declared in an enclosing class
  2. Uncaught SyntaxError: Unexpected private field

请注意,当 privateProp 变为公共(public)时,此代码将完美运行,但我想实现类似 protected 行为,并像任何支持继承的语言一样访问“私有(private)”字段。

任何帮助将不胜感激。

最佳答案

you can create a private property with getter and setter methods having restricted access by checking if the constructor is not of the parent class itself.

class Animal {
  #privateProp = 12;
  set Prop(val) {
    if (this.constructor.name !== 'Animal')
      return this.#privateProp = val;
    throw new Error('Cannot Access Protected property');
  }
  get Prop() {
    if (this.constructor.name !== 'Animal')
      return this.#privateProp;
    throw new Error('Cannot Access Protected property');
  }
}

class Cat extends Animal {
  get Prop() {
    return super.Prop;
  }

  set Prop(val) {
    super.Prop = val
  }
}

let cat = new Cat();
console.log(cat.Prop)
cat.Prop = 22
console.log(cat.Prop)

console.log(new Animal().Prop);

关于javascript - 从派生类访问基类的 protected 字段(ES2019 私有(private)类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61225283/

相关文章:

javascript - 如何在javascript中获取绝对元素的祖先定位元素?

javascript - 为什么从 javascript 连接 SQL 数据库是一种不好的做法?

c++ - 在 C++ 中构建简单的部分数组类时出现编译时错误

javascript - 扩展运算符如何在数组和 obj 中工作?

Javascript:创建不继承 css 的元素?

javascript - Web Audio Api 问题(DOM 异常 12)

groovy - groovy 中的私有(private)方法不是私有(private)的

amazon-web-services - 通过公共(public)实例使用 ssh 连接私有(private) EC2 实例

javascript - 将数组解构为对象属性键

javascript - 具有多个更改的扩展属性 : one-liner ecma immutability