我创建了一个模块,用于写入全局数组,如下所示:
class SomeLibrary {
constructor( product ) {
if (typeof window.globalArray === 'undefined'){
window.globalArray = [];
}
this._someVal = 0;
}
.
.
.
addToGlobalArray( obj ) {
obj.someVal = this._someVal;
window.globalArray.push( obj );
this._someVal++
}
.
.
.
.
}
let someLib = new SomeLibrary();
someLib.addToGlobalArray({test: 'hello'})
someLib.addToGlobalArray({test: 'hello again'});
并希望我的'globalArray''someVal'使用模块而不是参考的_someVal的当前值,结果如下所示:
//I want this outcome
[
{test: 'hello', someVal: 0},
{test: 'hello again', someVal: 1}
]
不(目前正在运作)
//I don't want this outcome
[
{test: 'hello', someVal: 1}, //someVal here is 1 as it is a reference to the current value of _someVal in the module
{test: 'hello again', someVal: 1}
]
我需要做什么才能将值而不是引用传递给全局对象?
(我无法访问jQuery或Underscore)
答案 0 :(得分:1)
您的代码已经按照您希望的方式运行。
根据定义,添加到要添加到全局数组的对象的属性是通过值(在该精确时刻的值)添加的,而不是通过引用添加的;事实上,除了通过" getters"之类的东西之外,没有办法在JS中做到这一点。或者"代理"。
我怀疑你实际上正在运行类似下面的代码:
var object = {test: "hello"};
someLib.addToGlobalArray(object})
object.test = "hello again";
someLib.addToGlobalArray(object);
这将导致单个对象{test: "hello again", someVal: 1}
占据全局数组中的第一个和第二个位置。 someVal
和globalArray[0]
中globalArray[1]
具有相同值1的事实与通过引用设置的某些概念无关;这只是因为它在两个插槽中都是相同的对象。