2016-11-08 116 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

希望這有助於