6

在这段代码中,原型仍然可以改变。

如何防止更改原型?

var a = {a:1}
var b={b:1}
var c = Object.create(a)
Object.getPrototypeOf(c) //a
c.__proto__ = b;
Object.getPrototypeOf(c) //b
var d = Object.create(null)
Object.getPrototypeOf(d) //null
d.__proto__ = b;
Object.getPrototypeOf(d) //null
4

2 回答 2

6

如何防止更改原型?

我假设您不是在谈论改变原型对象本身,而是覆盖现有对象的原型。

您可以使用Object.preventExtensions()来防止这种情况:

var a = {a:1}
var b = {b:1}
var c = Object.create(a)
Object.preventExtensions(c) 
console.log(Object.getPrototypeOf(c)) //a
c.__proto__ = b; // Error

但这也意味着您不能向其中添加任何新属性。您还可以使用Object.freeze()orObject.seal()根据您的需要,这会更多地限制对对象的修改。

虽然没有其他方法。

于 2016-11-11T23:20:53.993 回答
0

是的,我们可以,使用 Object.freeze。

Object.freeze() 方法冻结一个对象:即阻止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性、可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。

请参阅此冻结参考

检查这个片段

var a = {a:1}
var b={b:1}
var c = Object.create(a)
Object.getPrototypeOf(c) //a
Object.freeze(c);
c.__proto__ = b;//throws error now
console.log(Object.getPrototypeOf(c)) //a
var d = Object.create(null)
Object.getPrototypeOf(d) //null
d.__proto__ = b;
Object.getPrototypeOf(d) //null

希望这可以帮助

于 2016-11-11T23:21:44.957 回答