有啥方法可以逆转或撤消 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 功能?的主要内容,如果未能解决你的问题,请参考以下文章