可扩展对象,不允许更改现有属性?

时间:2017-04-19 19:21:52

标签: javascript

可以密封JavaScript对象,这可以防止添加新属性并删除或重新配置现有属性,但属性仍然可写。它们也可以被冻结,这是密封的,所有属性都变得不可写。

显然缺席的是能够使现有属性成为只读,不可移动,不可配置,同时使对象可扩展。这对于防止意外践踏对象的属性同时允许其他代码增加其属性非常有用。

使用vanilla JavaScript创建此类对象的最佳或惯用方法是什么?

2 个答案:

答案 0 :(得分:1)

只需遍历对象的属性,使每个属性都不可写且不可配置:

var obj = { "foo": 1, "bar": 3 };
Object.defineProperty(obj, "baz", { set: a=>a });

Object.getOwnPropertyNames(obj).forEach(function(name) {
    var desc = Object.getOwnPropertyDescriptor(obj, name);
    desc.configurable = false;

    // make the property non-writable if it is not an accessor property
    if(!desc.set && !desc.get) { desc.writable = false; }

    Object.defineProperty(obj, name, desc);
});

请注意,这并不会使setget方法"不可写"定义访问者属性。因为可写性的概念不适用于访问者属性 - 存储到访问者属性会运行setter。

答案 1 :(得分:1)

例如,您可以使用getter设置属性,如:

var object = {get property(){return "value"} };

将它们设为只读,这意味着您无法通过分配更改其值,如下所示:

 object.property = "other";

因为它没有二传手。因此object.property将继续返回"值",但您仍然可以删除'属性'密钥使用delete运算符。