具有私有/受保护属性的ES6类

问题描述 投票:0回答:2

我有如下ES6课程

class CoffeeMachine {
  constructor(power) {
    this._power = power;
  }
  get power() {
    return this._power;
  }
}

// create the coffee machine 
let coffeeMachine = new CoffeeMachine(100);

console.log(coffeeMachine);

我有2个问题;

  1. 对于console.log(coffeeMachine),我得到以下内容;
CoffeeMachine {
_power: 100,
__proto__:
power: 100
}

我可以看到“ power”在CoffeeMachine的proto上,并且具有相同的值,即100考虑到我没有在任何地方显式设置“电源”,怎么办?

  1. 在此示例中是否真的有可能实现私有/受保护?我知道最新的ES中有#privateVar,但想知道它是否可以在此代码中进行仿真吗?
javascript ecmascript-6 es6-class
2个回答
0
投票

您需要创建一个带有#前缀的私有变量。示例:

class CoffeeMachine {
  #_power;
  constructor(power) {
    this.#_power = power;
  }
  get power() {
    return this.#_power;
  }
}

// create the coffee machine 
let coffeeMachine = new CoffeeMachine(100);

console.log(coffeeMachine);
console.log(coffeeMachine._power);
console.log(coffeeMachine.power);

0
投票

getter和setter是transparent,这意味着观察者(控制台)无法区分常规属性和getter / setter。

考虑到我没有在任何地方明确设置“电源”,怎么办?

我猜这是控制台一次评估对象的所有值,然后将这些值与拥有那些属性的相应对象相关联。否则,它将不得不对getter / setter方法进行两次评估(一次用于对象,一次用于原型),并且这种行为可能是不需要的。

© www.soinside.com 2019 - 2024. All rights reserved.