js - 冻结当前属性

时间:2014-05-15 18:40:31

标签: javascript object

有没有办法冻结对象的现有属性,允许向其添加新属性?

Hello World,
我有一个window.foo对象,其中包含属性bar=1qux=2 我需要将它们冻结并且不可重复。

使用此代码很容易:

var foo = {};
Object.defineProperty(foo,"bar",{ "value":1 });
Object.defineProperty(foo,"qux",{ "value":2 });

window.foo={"bar":3};可以轻易覆盖这一点。

有什么办法吗?

谢谢:)

2 个答案:

答案 0 :(得分:2)

是的,我想我已经得到了它 关键是作为对象的不可写属性仍然可以被修改(添加属性等),因为"不可写的东西"关于它只是对象的地址 我不知道这一点,现在事实证明这很容易!

//non-writable window.foo
Object.defineProperty(window,"foo",{
 "enumerable":true,
 "value":{}
});

//Non-writable foo.bar
Object.defineProperty(window.foo,"bar",{
 "enumerable":true,
 "value":1
});

//Non-writable foo.qux
Object.defineProperty(window.foo,"qux",{
 "enumerable":true,
 "value":2
});

就在这里! :)
谢谢你的帮助。

答案 1 :(得分:0)

不,但您可以定义所有当前属性,使其不可写且不可配置,这将完成相同的任务。

Object.prototype.freezeAllCurrentProperties = function() {
  for(i in this) {
   if(this.hasOwnProperty(i)) {
     Object.defineProperty(this,i,{writable:false,configurable:false});
   }
  }
}

var x = {'firstProp':'a string'};
x.freezeAllCurrentProperties();
delete x['firstProp']; //returns false (thanks to configurable:false)
x['firstProp'] = false; //doesn't change (thanks to writable:false)
x.newProp = true; //adds newProp to x