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

时间:2013-12-08 09:12:43

标签: 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

似乎我只保护了财产分配。

有没有办法防止Array.push()等修改我的“不可写”数组的内容?

2 个答案:

答案 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}