0

私はこの基本タイプを持っています:

typeA = function () {

};

typeA.prototype = {
  do = function() { alert ("do something"); },
  doMore = function() { this.do(); }
}

および継承されたタイプtypeB:

typeB = function () {

};
typeB .prototype = new typeA();
typeB.prototype.do = function() { alert ("do something else"); };

typeBのインスタンスを作成してdoMoreを呼び出すと、this.doが関数ではないことを示すエラーが発生します。この種のことをJavascriptで行うことはできますか?

4

3 に答える 3

1

この例はあなたが探しているものですか?

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.prototypetypeAdoMoredoMore

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;

(私が今言ったことをすべて知っていたら申し訳ありませんが、内部でどのように機能していたかを説明したいと思いました;)

于 2012-06-22T01:17:43.483 に答える
0

doこの単語は予約キーワード (do while ループで使用) であるため使用できません。ただし、これを試すことができます:

typeA.prototype = {
    "do": function() { ... }
    ...
};

typeA["do"]();
于 2012-06-22T01:08:25.397 に答える
0

プロトタイプを操作するときは、コンストラクター関数を使用することをお勧めします。

あなたがしなければならないことは、typeA のプロトタイプを設定した後にオブジェクト be をインスタンス化することです。あなたがしているのは、 typeB が作成された後に .do() の新しい関数を動的に追加することです。それができる唯一の方法です。

function typeA() { };
typeA.prototype = {
    'do': function () { alert("do something"); },
    doMore: function () { this.do(); }
}
function typeB() { };
typeB.prototype = new typeA();
typeB.prototype['do'] = function () { alert('doing from typeB'); };
var b = new typeB();
//
b.do();
于 2012-06-22T01:30:47.573 に答える