查看下面的Javascript揭示模块模式,变量" defaultValue"不更新,需要getter访问和更新值 - 解释here。
为什么数组(例如defaultArray)会更新并且可以在没有特定getter的情况下访问?
示例代码:
var go = function () {
var defaultValue = null;
var defaultArray = [];
var setDefaultValue = function (newObj) {
for (var i = 0; i < 5; i++) {
if (i == 2) {
defaultValue = newObj;
defaultArray.push(newObj);
}
}
};
var getDefault = function () {
return defaultValue;
};
return {
defaultValue: defaultValue,
setDefaultValue: setDefaultValue,
getDefault: getDefault,
defaultArray: defaultArray,
};
};
window.onload = function () {
var ans = new go();
ans.setDefaultValue({ test: 'ok', unos: 123 })
// At this point, defaultArray has updated, but defaultValue has not
var thisWillBeNull = ans.defaultValue;
var thisWillHaveAValue = ans.defaultArray;
// Can get the value
var newDefault = ans.getDefault();
};
答案 0 :(得分:2)
不同之处在于编辑变量本身与它们引用的对象。
将一个变量或属性分配给另一个变量或属性时,始终会复制该值,并且变量/属性保持彼此独立。
// defaultValue: defaultValue
defaultValue ------\
>--- null
ans.defaultValue --/
// defaultArray: defaultArray
defaultArray ------\
>--- []
ans.defaultArray --/
defaultArray
内setDefaultValue()
的重新分配实际上是在改变变量,但对财产没有任何影响。
defaultValue ------- { test: 'ok', unos: 123 }
ans.defaultValue --- null
虽然.push()
正在改变Array
实例本身,但保持变量和属性不变为保持对数组的引用。
defaultArray --------\
>--- [
/ 0: { test: 'ok', unos: 123 }
/ ]
ans.defaultArray --/
通过将属性定义为getter和/或setter,它将不再拥有自己的值,并且将依赖于变量:
return {
get defaultValue() {
return defaultValue;
},
// ...
};
ans.defaultValue ----> defaultValue ----> null
ans.defaultValue ----> defaultValue ----> { test: 'ok', unos: 123 }