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:您是对的,我的错:)