6

我在 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)相同吗?

4

3 回答 3

5

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
于 2013-06-06T09:20:07.633 回答
2

writable属性仅将赋值运算符的使用限制为该属性本身。此外,属性的默认值writablefalse已经是.

例如:

var a = new Array(1,2,3,4);
a.length;    # 4
a.length++;  # a.length is still 4

你可以看到:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

如果您希望保留 的原始值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
于 2013-06-06T09:24:37.183 回答
0

它还取决于实际的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意味着你不能给它赋值。同时,它不会更改属性在读取时返回的内容。这取决于该属性的内部定义。

于 2013-06-06T09:35:26.787 回答