javascript - ES5 定义不可更改的数组/属性值

标签 javascript arrays object ecmascript-5 writable

当将数组定义为 ES5 样式对象的属性时,我希望使其属性的值无法更改。

'use strict';

var global = Object.create(Object.prototype, {
    names: {
        value: ['Barney', 'Trogdor'],
        writable: false
    }
});

global.names.push('Jackson'); // I expected a read-only error here

console.log(global.names[2]); // >> Jackson

global.names = ['Ooga', 'Booga']; // >> TypeError: "names" is read-only

看来我只保护了属性(property)分配。

有什么方法可以防止像 Array.push() 这样的东西修改我的“不可写”数组?

最佳答案

Object.seal() 似乎有效。

'use strict';

var global = Object.create(Object.prototype, {
    names: { value: Object.seal(['Barney', 'Trogdor']) }
});
global.names.push('Jackson'); // >> TypeError: global.names.push(...) is not extensible
<小时/>

编辑:实际上,没关系。

在前面的示例中,我是否要附加以下代码行:

global.names[0] = 'Jackson'; // Still works

我相信 Object.freeze() 是我真正想要的。

var global = Object.create(Object.prototype, {
    names: { value: Object.freeze(['Barney', 'Trogdor']) }
});
global.names.push('Jackson');  // >> TypeError: global.names.push(...) is not extensible
global.names[0] = 'Jackson';   // >> TypeError: 0 is read-only
global.names = ['Jackson'];    // >> TypeError: "names" is read-only

关于javascript - ES5 定义不可更改的数组/属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451681/

相关文章:

javascript - 取消选中父级时,jQuery 帮助我需要切换子级复选框

javascript - 为什么类 modal-side modal-top-right 不能在模态 Bootstrap 上工作?

c++ - 使用 for 语句从数组创建变量

python - Pandas 存储 1000 个数据框对象

javascript - 如何将javascript对象动态添加到另一个对象

javascript - 使用 Javascript 将字符串转换为对象(错误 : Unexpected token t in JSON at position 1)

javascript - 智能div,如果在屏幕左端则向右移动div,反之亦然

javascript - 提交表单后重定向到index.html - 如何显示消息

android - 使用数组作为公共(public)数组来保存随机数生成

c++ - cin.get() 后的回车; C++