有啥方法可以逆转或撤消 preventExtensions 功能?

Posted

技术标签:

【中文标题】有啥方法可以逆转或撤消 preventExtensions 功能?【英文标题】:Is there any way to reverse or undo the preventExtensions function?有什么方法可以逆转或撤消 preventExtensions 功能? 【发布时间】:2017-02-26 14:27:11 【问题描述】:

可以使不可扩展的对象可扩展吗?

var obj = ;
Object.preventExtensions(obj);
obj.abc = "abc"; // this line is ignored which is normal
//is there a way to make obj extensible again

【问题讨论】:

在MDN web docs 上它说“一旦对象不可扩展,就无法再次使其可扩展。”也许你可以重新分配对象? 【参考方案1】:

深度克隆怎么样?

obj = JSON.parse(JSON.stringify(obj));
obj.abc = "abc"; // this line is now OK

在本地代码中可以,但 obj 附带的任何外部引用将不再指向新形成的 obj

【讨论】:

也可以:obj = Object.assign(, obj); @frot.io 不会深度克隆完全看到:medium.com/@tkssharma/…【参考方案2】:

正如MDN 所说:

一旦对象不可扩展,就无法再次使其可扩展。

克服这种情况的最简单方法是克隆对象并将其分配给新变量:

const person = 
  name: "John",
  colors: 
    eyes: 'orange',
    hair: 'blue'
  
;

Object.preventExtensions(person);
console.log(Object.isExtensible(person)); // false

const extensiblePerson = ...person;
console.log(Object.isExtensible(extensiblePerson)); // true

需要注意的是,Object.preventExtensions 只防止对象顶层的扩展。在上面的例子中,person.colors 仍然是可扩展的,即使它的父对象不是。

console.log(Object.isExtensible(person.colors)); // true
console.log(extensiblePerson.colors === person.colors); // true

【讨论】:

以上是关于有啥方法可以逆转或撤消 preventExtensions 功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何撤消和/或清除添加到 UIView 的 UIImageView?

在 Rails 中撤消脚手架

算法和设计模式有啥区别

检测 iOS 13 撤消和重做

我可以撤消 GitHub 存储库中重置的提交吗? [复制]

撤消 git pull,如何将 repos 恢复到旧状态