Object.freeze()不会冻结传递对象中的对象有什么好处?

ale*_*son 9 javascript

我正在学习更多关于ObjectMDN 上JavaScript 构造函数的方法,我注意到Object.freeze描述的最后一句是:

请注意,仍然可以修改作为对象的值,除非它们也被冻结.

像这样的行为似乎应该选择加入.必须递归地手动冻结冻结对象的对象有什么好处?

如果我冻结一个物体,我为什么还要让它里面的物体仍然是可变的?

张实唯*_*张实唯 13

我认为如果递归是默认策略,一些复杂的对象可能无法按预期运行.考虑以下情况:

<div id="root">
    <div id="stem">
        <div id="leaf>
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

由于某种原因我想冻结stem,所以我写了这些代码:

Object.freeze(document.getElementById('stem'));
Run Code Online (Sandbox Code Playgroud)

如果它以递归方式冻结,那么它leaf也会被冻结,似乎没问题:如果我要冻结它stem,我也想冻结它的孩子.

但是等等,请注意stem还有另一个属性 - 它也有parentElement.那会发生什么?当我冻结stem,我也冻结stem.parentElement,并stem.parentElement.parentElement...这是从来没有我想要的.


Sha*_*sha 6

答案就在于这一点

Note that values that are objects can still be modified, unless they are also frozen.
Run Code Online (Sandbox Code Playgroud)

更新:

关于freeze()方法的设计决定,没有官方信息

我认为,基本上出于性能原因他们已经做出了这个决定,如果我们想让内部对象也被冻结,我们将不得不递归地应用该方法.所以这是一个很大的开销,所以做出了设计决定以避免这种情况.

如果不是性能,则该方法的行为会有所不同.