- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读“学习 JS 数据结构和算法”一书,书中说“项目”在以下类(class)中是公开的。
class Stack {
constructor(){
this.items = []
}
}
但是,如果我使用 WeakMap,那么我可以再次将项目设为私有(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 类 - 使用 WeakMap 使变量私有(private)化并在其他方法中仍然使用 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53369733/
有人可以在下面提供有关此信息的信息 我已经通过 Safari 浏览器在 appStore 网站上搜索了我的应用程序,但我看到下面的快照,我对此一无所知,有人可以向我提供有关此的一些信息(如果您在浏览器
我是一名优秀的程序员,十分优秀!