4

Objectに追加された新機能についてMDCを閲覧していました。そのうちの1つ、、は、またはObject.preventExtensionsを使用して取得できるオブジェクトのプロトタイプへの変異を防ぐと言われています。Object.getPrototypeOf__proto__

ただし、Chromeでは、オブジェクトのプロトタイプに変更を加えることができるようです。これは、関連するページのコードを実行するだけで確認できます。

// EXTENSION (only works in engines supporting __proto__
// (which is deprecated. Use Object.getPrototypeOf instead)):
// A non-extensible object's prototype is immutable.

var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: "hai" }; // throws a TypeError

これがわからないのでTypeErrorfixed.__proto__.oh === 'hai'禁止されているはずなのに設定されています。のようにコーディングするときにも追加できObject.getPrototypeOf(fixed).oh = 'hai'ます。

これは、Chromeがこの関数の解釈が異なることを意味しますか?オブジェクトのプロトタイプ(Chrome)の拡張を防ぐにはどうすればよいですか?

4

2 に答える 2

5

いいえ、ChromeとMozillaはどちらも、仕様の標準部分を同じように実装しています。注意して読みなさい:

Object.preventExtensions独自のプロパティの追加を防ぐだけです。プロパティは引き続きオブジェクトプロトタイプに追加できます。

関係することはすべて.__proto__非標準であり、Chromeはそれを異なる方法で実装できます。あなたは、Chromeが.__proto__異なる方法で、そして私の意見では、より直感的に詳細を実装することだけを示しました。仕様では、プロトタイプはまだ拡張可能であると述べているので、それを変更できるはずです。問題は、なぜMozillaがそれをそのように実装したのかということです。

たとえば、次のコードはChromeとFFの両方で同じように機能します。

var fixed = Object.preventExtensions({});
Object.getPrototypeOf(fixed).p = 99;
fixed.p; // 99

明らかに、プロトタイプはまだ変更可能です。これは、Chromeのの実装では理にかなってい.__proto__ます。

したがって、プロトタイプの拡張を防ぐために、個別に実行してください。

var fixed = Object.preventExtensions({});
Object.preventExtensions(Object.getPrototypeOf(fixed));
Object.getPrototypeOf(fixed).p = 99; // TypeError: Can't add property p, object is not extensible
于 2011-06-08T15:43:30.503 に答える
2

ECMAScript 5 では、オブジェクトにはという名前のブール内部プロパティ[[Extensible]]があり、このプロパティはメソッドfalseを呼び出したときに に設定されます。Object.preventExtensionsその後、新しい独自のプロパティをオブジェクトに追加することはできません。

Chrome 14.0.786.0 では、期待どおりに割り当て__proto__が a をスローTypeErrorします。

ただし、__proto__拡張機能は非標準であるため、動作が異なる場合があることに注意してください。もちろん、構文的には「プロパティの割り当て」ですが、内部的には「独自のプロパティを追加」するのではなく、オブジェクトのプロトタイプを変更します。任意の標準的な方法で行うことができます。

あなたが私たちに示したメソッドの例についてはObject.getPrototypeOf、オブジェクトのプロトタイプを取得するだけです.あなたのfixedオブジェクトの場合、それはObject.prototypeオブジェクトです:

Object.getPrototypeOf(fixed) === Object.prototype; // true

だからあなたの例:

Object.getPrototypeOf(fixed).oh = 'hai'

以下と同等です。

Object.prototype.oh === 'hai';
于 2011-06-08T15:48:36.657 に答える