我正在学习更多关于Object
MDN 上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
...这是从来没有我想要的.
答案就在于这一点
Note that values that are objects can still be modified, unless they are also frozen.
Run Code Online (Sandbox Code Playgroud)
更新:
关于freeze()方法的设计决定,没有官方信息
我认为,基本上出于性能原因他们已经做出了这个决定,如果我们想让内部对象也被冻结,我们将不得不递归地应用该方法.所以这是一个很大的开销,所以做出了设计决定以避免这种情况.
如果不是性能,则该方法的行为会有所不同.
归档时间: |
|
查看次数: |
3019 次 |
最近记录: |