为什么数组'的长度属性'的值改变,即使在javascript中设置为只读

Why an array's length property's value changes even when set as read-only in javascript?

本文关键字:javascript 设置 只读 数组 属性 改变 为什么      更新时间:2023-09-26

我尝试了以下代码在chrome的控制台

var a = new Array(1,2,3,4);
a.length

显示长度为预期的4。现在我尝试将长度属性设置为可写:false

Object.defineProperty(a, "length", {writable: false});
a[4] = 5;
a.length

结果是5,即使属性被设置为writable:false。这是怎么发生的?它不应该保持与设置为只读(可写: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

您可以看到: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

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