我一直在使用它作为如何为我的对象声明静态成员的一个非常好的解决方法,但我真的不明白为什么它们会变成静态,所以我需要有人向我解释以下行为。
我有以下声明:
// Primitive so nothing interesting here
Array.prototype.someMember = "My value is not static";
// Object containing a primitive, now this is the deal
Array.prototype.someOtherMember = {
value: "My value is static"
};
Array.prototype.changeMember = function (newValue) {
// Change the primitive value
this.someMember = newValue;
// Change the primitive value inside the object
this.someOtherMember.value = newValue;
};
如果这是通过以下方式测试的:
var arr1 = [], arr2 = [], arr3 = [];
arr1.changeMember('I changed');
alert(arr1.someMember + ', ' + arr2.someMember + ', ' + arr3.someMember);
alert(arr1.someOtherMember.value + ', ' + arr2.someOtherMember.value + ', ' + arr3.someOtherMember.value);
结果是:
我变了,我的价值不是静态的,我的价值不是静态的
我变了,我变了,我变了
changeMember
现在,如果我在这样的方法中重新分配整个对象:
Array.prototype.changeMember = function (newValue) {
// Change the primitive value
this.someMember = newValue;
// Change the object
this.someOtherMember = { value: newValue };
};
ThensomeOtherMember
不再是静态的,而是 Array 的第一个实例拥有它自己的。我不明白这种行为,因为毕竟我在这两种情况下都someOtherMember
通过访问this
,所以我无法弄清楚为什么它在第一种情况下是静态的,而在第二种情况下它不是静态的。