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

时间:2020-03-19 18:26:36

标签: javascript ecmascript-6 es6-class

我的ES6课程如下

rows, err := db.Query(`Query`)

if err != nil {
		//error
		return 
	} else {
		// logging
	}
}

for rows.Next() {
		ref := &structurre{}

		err := rows.Scan(&ref.number, &ref.animal[0].tiger, &ref.animal[o].lion)
		if err != nil {
			logEntry.Info(err)
			return details, err

		}
		details = append(details, ref)
}
  
type structure struct {
 number string
 animal []*zoo
}

type zoo struct {
  tiger string
  lion string
}

我有2个问题;

  1. 对于console.log(coffeeMachine),我得到以下内容;
function a(n){
    if(n == 1){
        return;
    }
    a(--n);
    console.log("hello world = ",n);    
}

a(10);

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

  1. 在此示例中是否真的可以实现私有/受保护的?我知道最新的ES中有#privateVar,但是想知道它是否可以在此代码中进行仿真吗?

2 个答案:

答案 0 :(得分:2)

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

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

我猜这是控制台一次评估对象的所有值,然后将这些值与拥有那些属性的相应对象相关联。否则,它将不得不对吸气剂进行两次评估(一次针对对象,一次针对原型),而这种行为可能是不希望的。

不过,您可以在原型上手动评估吸气剂:

class See { get me() { return "now"; } }

console.log(See.prototype.me);

在此示例中是否真的有可能实现私有/受保护?

是的,在ES6中肯定可以在地图周围使用IIFE:

 const Private = (() => {
    const priv = new WeakMap();

    return class {
      get priv() { return priv.get(this); }
      set priv(v) { priv.set(this, v); }
    };
 })();

但是,正如已经在评论中指出的那样,您可能不需要它。正如您所说,对于ES2020,还有私有财产。

答案 1 :(得分: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);

相关问题