在 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 有时仍然不能非常有效地实现冻结对象(在某些情况下它们可能比常规对象慢,因为出于历史原因它们被认为是一种特殊情况).
我想知道 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 有时仍然不能非常有效地实现冻结对象(在某些情况下它们可能比常规对象慢,因为出于历史原因它们被认为是一种特殊情况).