2

プロパティを通じてjavascriptプロトタイプの継承を理解してい__proto__ます。var f = function() {}ただし、実行すると、prototypeプロパティに加えてプロパティが追加されることに気付きました__proto__prototypeプロパティチェーンには参加していないようです。それは正確に何をしますか?

4

2 に答える 2

4

newキーワードを介してその関数を使用して作成されたオブジェクトのプロトタイプとして割り当てられます。

たとえば、次のようになります。

function Foo() {
}
Foo.prototype.bar = 47;

var obj = new Foo();
alert(obj.bar); // alerts 47, via `obj`'s prototype

objとに割り当てられたオブジェクト間の参照Foo.prototypeはライブのものであるため、さらに追加すると、のプロトタイプFoo.prototypeに表示されます。obj

Foo.prototype.charlie = 62;
alert(obj.charlie); // alerts 62

当然、 (私はお勧めしませんが)置き換える と、別のオブジェクトをFoo.prototype指していることになります。まだ古いものを参照します:Foo.prototypeobj

Foo.prototype = {delta: 77}; // Not recommended
alert(obj.delta); // alerts "undefined"

無償の実例

について__proto____proto__は非標準です。ECMAScript5(1年半前)以前は、オブジェクトのプロトタイプを直接操作する標準的な方法はありませんでした。オブジェクトの作成時にのみ、コンストラクター関数のprototypeプロパティを介して間接的にのみ割り当てることができました。__proto__一部のJavaScriptエンジン(特にMozillaのSpiderMonkey、Firefoxのエンジン)の独自の拡張機能です。これは標準ではなく、ECMAScript委員会によると、標準ではありません。(代わりに、ECMAScript5は、オブジェクトのプロトタイプと対話するための関数を提供します。) Mozillaでは__proto__非推奨になりました。

于 2011-06-06T18:22:58.527 に答える
4

_proto_ プロパティは、オブジェクト(この場合は関数であるオブジェクト)のインスタンスのプロパティであり、インスタンスのプロトタイプを参照しますこのプロパティは非標準であり、減価償却されていることに注意してください。Object.getPrototypeOf(ref)代わりに、 https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Protoを使用してください。

prototype対照的に、は関数宣言のプロパティ(インスタンスではない)であり、関数のすべてのインスタンスのプロトタイプです。ドキュメントをチェックしてください:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/prototype

new(キーワードを使用して)関数の新しいインスタンスを作成すると、で定義されているように関数オブジェクトが作成されprototypeます。インスタンス化された後(var myNewObject = new Foo())、を呼び出すとObject.getPrototypeOf(myNewObject)、インスタンスのベースとなっているプロトタイプへの参照が返されます。

要約すると__proto__、何かprototypeが何であるか、何かができる(またはすでにあるかもしれない)ものです。

于 2011-06-06T18:26:38.133 に答える