gpt4 book ai didi

javascript单例如何更改类内的属性

转载 作者:行者123 更新时间:2023-12-02 16:43:27 26 4
gpt4 key购买 nike

我看到人们使用 Object.freeze 和其他一些技术来创建单例类。

假设我有这门课。

class Test {
constructor(){
this.data = [];
}

setData(){
this.data = [1,2,3];
}

}

const test = new Test();
Object.freeze(test);
export default test;

现在,我将其导入另一个文件。

import Test from './test'
Test.setData();

现在这会导致错误 Cannot assign to read only property to data 这意味着我什至不能为我的属性使用 setter/getter。

问题 1)如果我们甚至不能更改类内的属性,为什么还要使用 Object.freeze

问题 2)我该怎么做才能在类外而不是在类内更改属性?

最佳答案

使用 Object.freeze

以防您尝试实现所描述的内容 here .该方法与您在此处所做的事情之间的区别在于,您应该更新数据数组而不是完全重新分配它。自 Object.freeze我们基本上执行浅卡住,您可以在 data 数组上推送和弹出,但不能重新分配它(这就是您在示例中所做的)。所以以下将起作用:

class Test {
constructor(){
this.data = [];
}

setData(data) {
this.data.push(...data);
}

}

const test = new Test();
Object.freeze(test);
export default test;

然后你可以像这样添加你的数据:

import Test from './test'
Test.setData(1,2,3);

私有(private)属性

据我所知,您的目标是实际创建无法在单例之外更新的私有(private)属性,因此您也可以按照此答案 SO Answer 中概述的方法进行操作.在您的情况下,这看起来像以下内容:

class Test {
constructor(){
let data = [];
this.setData = (newData) => data = newData;
this.getData = () => data;
}
}

const test = new Test();
test.setData([1,2,3]);

console.log(test.getData());
由于数据字段没有直接公开,而是仅在您的构造函数范围内公开,因此更新或检索它的唯一方法是使用 setDatagetData,这正是您的目标去做。

关于javascript单例如何更改类内的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61097362/

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