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当然,但原型上的不可配置也是这样,所以这不是什么新鲜事。但你是对的,到目前为止,“没有效果”是一个过于宽泛的说法,我会更正我的答案。