Javascript js-冻结当前属性 有没有办法冻结对象的现有属性,以便向其添加新属性?

Javascript js-冻结当前属性 有没有办法冻结对象的现有属性,以便向其添加新属性?,javascript,object,Javascript,Object,你好,世界, 我有一个window.foo对象,其属性为bar=1和qux=2 我需要这些被冻结和不可写 使用此代码很容易: var foo = {}; Object.defineProperty(foo,"bar",{ "value":1 }); Object.defineProperty(foo,"qux",{ "value":2 }); 但是这很容易被window.foo={“bar”:3}覆盖 有什么办法吗? 谢谢:)否,但您可以定义所有当前属性,使其不可写且不可配置,这将完成相同的任

你好,世界,
我有一个
window.foo
对象,其属性为
bar=1
qux=2

我需要这些被冻结和不可写

使用此代码很容易:

var foo = {};
Object.defineProperty(foo,"bar",{ "value":1 });
Object.defineProperty(foo,"qux",{ "value":2 });
但是这很容易被
window.foo={“bar”:3}覆盖

有什么办法吗?


谢谢:)

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

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

是的,我想我知道了。
关键是对象的不可写属性仍然可以修改(添加属性等),因为它的“不可写内容”只是对象的地址。
我不知道这件事,现在看来很容易

//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
});
就在这里!:)

谢谢你的帮助。

仔细阅读我的问题!您可以使用
x={'firstProp':'other string}事实上重写它们更进一步,听起来你真正想做的是在你的对象周围包装一个孤立的作用域,这样它只能通过一个API来访问,这为你强制了冻结…然后再次。这只是JavaScript,如果您担心它,人们总是可以覆盖您的访问器方法。如果您冻结了对象属性,您仍然可以写入
foo
变量。在这方面,您的解决方案没有区别。@m93a您错了,使用
对象。冻结(foo)
并不能阻止您执行
foo=undefined
,或
foo={'firstProp':'pileOfCrap'}
@Bergi&Adam:您是对的,我的错:)