プロパティを通じてjavascriptプロトタイプの継承を理解してい__proto__
ます。var f = function() {}
ただし、実行すると、prototype
プロパティに加えてプロパティが追加されることに気付きました__proto__
。prototype
プロパティチェーンには参加していないようです。それは正確に何をしますか?
2 に答える
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.prototype
obj
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__
非推奨になりました。
_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
が何であるか、何かができる(またはすでにあるかもしれない)ものです。