在v8中冻结对象__proto__

时间:2015-09-15 18:35:02

标签: javascript node.js v8

我想知道freezing对象原型是否有任何警告。我试图创建一个不可变对象,但从文档

中找到
  

作为对象的值仍然可以修改,除非它们也是   冷冻

我试图使__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中观察到)。我想知道冻结对象原型有什么副作用(可能涉及多个实例?或正确的对象实例化?)。目标环境用于节点。谢谢

1 个答案:

答案 0 :(得分:3)

冻结原型的副作用是(重复地)原型被冷冻。这是否会导致问题取决于您的应用程序打算如何使用原型。就语言而言,它没有任何本质上的错误。我甚至认为它的风格很好,如果不是因为虚拟机有时候仍然没有非常有效地实现冻结物体(在某些情况下它们可能比常规物体慢,因为历史原因它们是被视为特例)。