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()orを使用して、オブジェクトへの変更をさらに制限することもできます。Object.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 に答える