在 v8 中冻结对象 __proto__

Freezing object __proto__ in v8

我想知道 freezing 对象原型是否有任何注意事项。我试图创建一个不可变对象,但从文档中发现

values that are objects can still be modified, unless they are also frozen

我正在尝试使 __proto__ 属性 不可变,我最初的尝试涉及 freeze 实例:

$ node --version
v0.12.7
$ node
> function Test() {}
undefined
> Test.prototype = {
...  hi: function() { return 'hello' }
... }
{ hi: [Function] }
> t = Object.freeze(new Test())
{}
> t
{}
> t.hello = 'hi'
'hi'
> t
{}
> t.hi
[Function]
> t.hi()
'hello'
> t.__proto__.hi = 'changed'
'changed'
> t.hi
'changed'

但是当 prototype 被冻结时,__proto__ 对象如预期的那样是不可变的。

> Test.prototype = Object.freeze({
    ...  hi: function() { return 'hello' }
    ... })

现在 Test 的实例有一个不可变的 __proto__ 对象(从 shell 观察到)。我想知道冻结对象原型是否有任何副作用(可能涉及多个实例?或正确的对象实例化??)。目标环境是针对节点的。谢谢

冻结原型的副作用是(同义反复)原型被冻结了。这是否会导致问题取决于您的应用程序打算如何使用原型。就语言而言,它本身没有任何问题。我什至会认为它是一种很好的风格,如果不是因为 VM 有时仍然不能非常有效地实现冻结对象(在某些情况下它们可能比常规对象慢,因为出于历史原因它们被认为是一种特殊情况).