我一直在使用这一段时间作为一个非常好的解决方法,如何为我的对象声明静态成员,但我真的不明白他们为什么变成静态的,所以我需要有人向我解释以下行为。静态javascript成员
我有以下声明:
// 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 };
};
然后someOtherMember
不再是静态的,而是数组的第一个实例得到它自己的。我不理解的行为,因为毕竟我是通过在这两种情况下this
访问someOtherMember
,所以我想不通为什么它在第一种情况下静态的,它不是在第二个静态的。
那么Object.defineProperty和Array.prototype.someOtherMember = { value:“我的值是静态的” }之间的区别是什么? –
@ KonstantinD-Infragistics:使用'Object.defineProperty',你不分配一个对象字面值,你将一个属性定义为只读/ rw,(非)enumerable,...只是阅读文档 –