将数组定义为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
似乎我只保护了财产分配。
有没有办法防止Array.push()
等修改我的“不可写”数组的内容?
答案 0 :(得分:3)
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
答案 1 :(得分:-2)
加载完所有数据后,为什么不覆盖你所拥有的推送方法:
global.names.push = function () {return false}