我在 chrome 的控制台中尝试了以下代码
var a = new Array(1,2,3,4);
a.length
正如预期的那样,这显示长度为 4。现在我尝试将长度属性设置为可写:false
Object.defineProperty(a, "length", {writable: false});
a[4] = 5;
a.length
即使该属性设置为 writable:false,这也会产生 5。那是怎么发生的?它不应该保持与设置为只读(可写:false)相同吗?
我在 chrome 的控制台中尝试了以下代码
var a = new Array(1,2,3,4);
a.length
正如预期的那样,这显示长度为 4。现在我尝试将长度属性设置为可写:false
Object.defineProperty(a, "length", {writable: false});
a[4] = 5;
a.length
即使该属性设置为 writable:false,这也会产生 5。那是怎么发生的?它不应该保持与设置为只读(可写:false)相同吗?
Object.defineProperty(a, "length", {writable: false});
只会影响您将值直接分配给.length
属性的方式。
var a = [1,2,3,4];
Object.defineProperty(a, "length", {writable: false});
a.length = 0;
console.log(a.length); // still be 4
该writable
属性仅将赋值运算符的使用限制为该属性本身。此外,属性的默认值writable
false
已经是.
例如:
var a = new Array(1,2,3,4);
a.length; # 4
a.length++; # a.length is still 4
如果您希望保留 的原始值a.length
,我认为您最好将其分配给另一个变量:
x = [1,2,3,4]; # x.length is 4
y = x.length; # y is 4
x = [1,2,3,4,5] # x.length is now 5, but y is still 4
它还取决于实际的length
财产回报。请参阅以下示例
var MyObject = function(){
var _count = 0;
this.increment = function(){
_count++;
}
this.getCount = function(){
return _count;
}
};
var object = new MyObject();
Object.defineProperty(object, "count", { // new property `count` calls `getCount`
writeable:false,
get: function(){
return this.getCount();
}
});
alert(object.count); // 0
object.count = 90;
object.increment();
alert(object.count); // 1
object.count = 100;
object.increment();
alert(object.count); //2
创建一个属性read-only
意味着你不能给它赋值。同时,它不会更改属性在读取时返回的内容。这取决于该属性的内部定义。