gpt4 book ai didi

javascript - JavaScript 私有(private)字段是按类还是按实例私有(private)的?

转载 作者:行者123 更新时间:2023-12-05 04:32:51 24 4
gpt4 key购买 nike

JavaScript 最近添加了私有(private)类字段,以散列前缀命名。

( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields )

我正在寻找关于这种形式的隐私是“按类”还是“按实例”的明确答案。

假设一个 Person 类定义了一个名为“#secret”的私有(private)字段。

我使用“new”构造了 Person 类的两个实例:person1 和 person2。

person1 是否有权检查和修改 person2 的#secret 字段?

class Person {
#secret;
constructor(secret) {
this.#secret = secret;
}
getSomebodyElsesSecret(somebody) {
return somebody.#secret;
}
setSomebodyElsesSecret(somebody, value) {
somebody.#secret = value;
}
}

最佳答案

它们是按类的 - 一个实例可以查看和修改另一个实例。

class Person {
#secret;
constructor(secret) {
this.#secret = secret;
}
getSomebodyElsesSecret(somebody) {
return somebody.#secret;
}
setSomebodyElsesSecret(somebody, value) {
somebody.#secret = value;
}
}

const a = new Person('a');
const b = new Person('b');
console.log(a.getSomebodyElsesSecret(b))
a.setSomebodyElsesSecret(b, 'c');
console.log(a.getSomebodyElsesSecret(b))

一种看待它的方法是,私有(private)字段类似于仅限于类范围的变量 - 它们可以被类的 {} 中的任何内容引用>,并且不能被外部引用。

就范围而言,它有点像定义私有(private)变量的 WeakMap 和返回类的 IIFE:

const Person = (() => {
const secrets = new WeakMap();
return class Person {
constructor(secret) {
secrets.set(this, secret);
}
getSomebodyElsesSecret(somebody) {
return secrets.get(somebody);
}
setSomebodyElsesSecret(somebody, value) {
secrets.set(somebody, value);
}
}
})();

const a = new Person('a');
const b = new Person('b');
console.log(a.getSomebodyElsesSecret(b))
a.setSomebodyElsesSecret(b, 'c');
console.log(a.getSomebodyElsesSecret(b))

关于javascript - JavaScript 私有(private)字段是按类还是按实例私有(private)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71580410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com