2016-11-08 51 views
5

在这段代码中,原型仍然可以改变。如何防止更改原型?

我该如何防止对原型进行更改?

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 
+1

原型是就像所有其他的一个对象,这意味着你可以冻结/密封它。 – Bergi

+1

'__proto__'已弃用。如果必须使用'Object.setPrototypeOf'。 – Bergi

回答

5

如何防止更改原型?

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

您可以使用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()Object.seal(),这些限制对对象的更改。

虽然没有其他方法。

0

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

Object.freeze()方法冻结一个对象:也就是说,阻止将新属性添加到它;防止现有属性被删除;并防止改变现有属性或其可枚举性,可配置性或可写性。本质上,该对象是有效的不可变的。该方法返回被冻结的对象。

看到这个freeze reference

检查这个片段

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

希望这有助于