gpt4 book ai didi

JavaScript 类 - 使用 Wea​​kMap 使变量私有(private)化并在其他方法中仍然使用 "this"

转载 作者:行者123 更新时间:2023-11-30 20:01:07 25 4
gpt4 key购买 nike

我正在阅读“学习 JS 数据结构和算法”一书,书中说“项目”在以下类(class)中是公开的。

class Stack {
constructor(){
this.items = []
}
}

但是,如果我使用 Wea​​kMap,那么我可以再次将项目设为私有(private),只是在给出的示例中,它们没有像我期望的那样使用“this”。

const items = new WeakMap();
class Stack {
constructor(){
items.set(this, []);
}
}

然后它给出了一些代码示例,这些代码可以执行 items.set 或 items.get 之类的操作来访问事物,这看起来不错,但我想知道我是否可以缩短对 item.get(value) 的访问像这样将构造函数添加到“this”上:

const items = new WeakMap();
class Stack {
constructor() {
items.set(this, []);
this.stack = items.get(this, []);

push(item) {
this.stack.push(item)
}
}

现在,我可以使用 this.stack 访问 items.get() 功能,但我不确定它是否再次公开,并且想知道是否有人可以帮我解决这个问题?

最佳答案

是的 - this 的任何属性实际上都是公开的。因此,如果您有 this.stack,并且 stack 引用一个数组,那么该数组将可以从任何可以访问实例化对象的对象中查看和更改,您可能不想。

请注意,即使在第二个代码片段中,items WeakMap 的使用也不足以使数据私有(private) - 例如,任何有权访问 items 和实例化对象的对象都可以更改该项目的数组:

const items = new WeakMap();
class Stack {
constructor() {
items.set(this, []);
}
}

const s = new Stack();
items.get(s).push('foo');
console.log(items.get(s));

要解决这个问题,一个选择是将整个东西放在 IIFE 中,items 作用域 IIFE 中,然后返回类:

const Stack = (() => {
const items = new WeakMap();
return class Stack {
constructor() {
items.set(this, []);
}
};
})();
const s = new Stack();
// now, items can only be seen and modified through Stack's internal methods

关于JavaScript 类 - 使用 Wea​​kMap 使变量私有(private)化并在其他方法中仍然使用 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369733/

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