Javascript - 获取对象属性值NOT引用

时间:2016-08-31 09:46:30

标签: javascript ecmascript-6

我创建了一个模块,用于写入全局数组,如下所示:

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)

1 个答案:

答案 0 :(得分:1)

您的代码已经按照您希望的方式运行。

根据定义,添加到要添加到全局数组的对象的属性是通过(在该精确时刻的值)添加的,而不是通过引用添加的;事实上,除了通过" getters"之类的东西之外,没有办法在JS中做到这一点。或者"代理"。

我怀疑你实际上正在运行类似下面的代码:

var object = {test: "hello"};
someLib.addToGlobalArray(object})

object.test = "hello again"; 
someLib.addToGlobalArray(object);

这将导致单个对象{test: "hello again", someVal: 1}占据全局数组中的第一个和第二个位置。 someValglobalArray[0]globalArray[1]具有相同值1的事实与通过引用设置的某些概念无关;这只是因为它在两个插槽中都是相同的对象