Javascript Object.seal(Object.prototype)是否使所有对象都不可变?
假设我创建了一个这样的对象Javascript Object.seal(Object.prototype)是否使所有对象都不可变?,javascript,Javascript,假设我创建了一个这样的对象 var obj={M:“soober”}; 它的[[Prototype]]内部属性指向对象。Prototype 现在,如果我跑 Object.seal(Object.prototype); …这是否使程序中的所有对象都不可变 我需要澄清这一点。Object.seal()方法密封对象,防止向其添加新属性,并将所有现有属性标记为不可配置。当前属性的值仍然可以更改,只要它们是可写的。让我们看看: > var b = Object.create(Object.sea
var obj={M:“soober”};
它的[[Prototype]]内部属性指向对象。Prototype
现在,如果我跑
Object.seal(Object.prototype);
…这是否使程序中的所有对象都不可变
我需要澄清这一点。Object.seal()方法密封对象,防止向其添加新属性,并将所有现有属性标记为不可配置。当前属性的值仍然可以更改,只要它们是可写的。让我们看看:
> var b = Object.create(Object.seal({}));
> b.foo = 'bar';
> b.foo
"bar"
…这是否使程序中的所有对象都不可变
没有
从:
Object.seal()
方法密封对象,防止向其添加新属性,并将所有现有属性标记为不可配置。当前属性的值仍然可以更改,只要它们是可写的
由于
b
未密封(其原型是),因此向其添加新属性没有问题。原型是一个单独的对象,只有在对象本身(以及原型链的下游)中未找到此类属性时才会查询其属性
因此,密封原型只会阻止将新属性添加到原型本身,而不会影响是否可以将属性添加到从该原型继承的其他对象
Object.freeze
,而不是Object.seal
对于这些简单的事情,我建议您在控制台上简单地尝试一下,并且/或者不,seal/freeze很浅……第2点似乎是错误的:如果原型被冻结,子代就无法正常设置属性。试试看。@trusktr,
(()=>{let prot=Object.create(null);let instance=Object.create(prot);Object.freeze(prot);instance.foo=“bar”;console.log(instance)})()代码>。子代可以用冻结的原型修改。啊,看起来它只影响原型中预先存在的属性。试试这个:{let a=Object.freeze({foo:'foo'});let b=Object.create(a);b.foo='bar';console.log(b);}
@trusktr当然,但原型上的不可配置也是这样,所以这不是什么新鲜事。但你是对的,到目前为止,“没有效果”是一个过于宽泛的说法,我会更正我的答案。