この例はあなたが探しているものですか?
typeA = function () { };
typeA.prototype = {
do : function() { alert ("do something"); }, //use : instead of = here
doMore : function() { this.do(); }
}
typeB = function () { };
typeB.prototype = new typeA();
typeB.prototype.do = function() { alert ("do something else"); };
var instance = new typeB();
instance.doMore();
:
オブジェクトのプロパティを宣言するとき、および=
変数に値を割り当てるときに使用します。:D
追加説明:
ここで興味深いことが起こります。
typeB.prototype = 新しい typeA();
を使用してオブジェクトの関数または変数にアクセスすると.
、ブラウザは最初にオブジェクト自体を調べて、その変数がそこで定義されているかどうかを確認します。これが、次のようなことができる理由です。
var foo = function() {};
foo.prototype.bar = 3
instance = new foo();
alert( instance.bar ); //alerts 3
instance["bar"] = 55; //add a variable to the instance object itself
alert( instance.bar ); //alerts 55, instance variable masks prototype variable
これは、何かがオブジェクトの「中に」入る方法が 2 つあることを示しています。これは、オブジェクト自体 (コンストラクターに追加することによっても実行できますthis.bar = 55
) またはオブジェクトのプロトタイプに含めることができます。
typeB.prototype = new typeA();
したがって、そのインスタンスのすべてを に入れているtypeA
と言うときtypeB'prototype
。あなたが基本的に言ったことは、「ねえ、ブラウザ、typeB のインスタンスで何かが見つからない場合は、typeA のこのインスタンスにあるかどうかを確認してください!」です。
そのインスタンスには実際には何もないことがわかります。そのプロトタイプには、ブラウザーがそのオブジェクト自体でその名前の変数を見つけることができない場合に使用されるものだけがあります。を呼び出すinstance.doMore()
と、ブラウザは でそれを見つけることができないため、 のインスタンスに設定した をinstance
検索します。そのインスタンスで呼び出されたものが見つからないため、プロトタイプを調べ、最終的に定義を見つけて喜んで呼び出します。typeB.prototype
typeA
doMore
doMore
typeA
興味深い点の 1 つは、プロトタイプとして設定したインスタンスの実際にあるものをいじることができることです。
//earlier code the same
foo = new typeA();
typeB.prototype = foo;
foo.do = function() { alert ("do something else"); };
//^^ same as `typeB.prototype.do = function() { alert ("do something else"); };`
var instance = new typeB();
instance.doMore();
IMHO で何が起こっているかを理解している場合、これは一種のクールですが、余分な間接レイヤー (typeA.prototype を調べる前に typeA のインスタンスで何かが定義されているかどうかを確認すること) はおそらく最良のアイデアではなく、コードはあなたがこれを言ったなら、おそらくより明確です:
typeB.prototype = typeA.prototype;
(私が今言ったことをすべて知っていたら申し訳ありませんが、内部でどのように機能していたかを説明したいと思いました;)