15

私はjavascriptとhtml5を使用して簡単なプラットフォームゲームを書いています。私はオブジェクト指向の方法でjavascriptを使用しています。継承を機能させるために、私は以下を使用しています。

// http://www.sitepoint.com/blogs/2006/01/17/javascript-inheritance/
function copyPrototype(descendant, parent) {
    var sConstructor = parent.toString();
    var aMatch = sConstructor.match(/\s*function (.*)\(/);
    if (aMatch != null) { descendant.prototype[aMatch[1]] = parent; }
    for (var m in parent.prototype) {
        descendant.prototype[m] = parent.prototype[m];
    }
};

この投稿のために、次の例を検討してください。

function A() {
 this.Name = 'Class A'
}
A.prototype.PrintName = function () {
 alert(this.Name);
}

function B() {
 this.A();
}
copyPrototype(B, A);

function C() {
 this.B();
}
copyPrototype(C, B);

var instC = new C();

if (instC instanceof A)
  alert ('horray!');

私が理解しているように、CはC&B&Aのインスタンスであるため、ホレイアラートボックスが表示されることを期待しています。私は間違っていますか?それとも、間違った方法でチェックしているだけですか?または、copyPrototypeがinstanceof演算子を破壊しましたか?

いつもお時間を割いていただきありがとうございます!

ショー。

4

4 に答える 4

17

問題は、copyPrototype関数がコンストラクターのプロトタイプから別のプロトタイプにプロパティをコピーするだけであるということです。たとえば、最後に、の内部[[Prototype]]リンクはC.prototype単にを指しObject.prototypeます。

とコンストラクターのプロトタイプのプロトタイプチェーンはinstC次のようになります。

                [[プロトタイプ]]
    A.prototype --------------> | ------------------- |
                               | |
    B.prototype --------------> | Object.prototype | ---> null
                               | |
    C.prototype --------------> | ------------------- |
        ^
        |
      instC

instanceofオペレーターはプロトタイプチェーンをトラバースします。instCご覧のとおり、オブジェクトはプロトタイプチェーンにのみ存在しC.prototypeますObject.prototype

コンストラクターのプロトタイプを「親」コンストラクターのオブジェクトインスタンスに設定することで、目的を達成できます。次に例を示します。

function A() {
  this.Name = 'Class A'
}

A.prototype.PrintName = function () {
  alert(this.Name);
}

function B() {
  //..
}
B.prototype = new A();
B.prototype.constructor = B; // fix constructor property


function C() {
  //..
}

C.prototype = new B();
C.prototype.constructor = C; // fix constructor property

var instC = new C();
if (instC instanceof A)
  alert('horray!');

これで、オブジェクトのプロトタイプチェーンはinstC次のようになります。

           --------------- --------------- ---------------
  instC- > | C.プロトタイプ| -----> | B.プロトタイプ| -----> | A.プロトタイプ|
           --------------- --------------- ---------------
                                                                |
                                                                V
                                                       --------------------
                                                       | Object.prototype |
                                                       --------------------
                                                                |
                                                                V
                                                               ヌル

おすすめ記事:

于 2010-06-30T00:30:39.510 に答える
1

最近、John Resig (The jQuery Guy!) による OO javascript の優れた実装を見つけました。これを将来のプロジェクトに使用します。http://ejohn.org/blog/simple-javascript-inheritance/

于 2012-01-16T12:46:02.413 に答える
1

わかりました、instanceof 関数の動作を維持し、継承チェーンを介してコンストラクターのパラメーターを渡すことを可能にするソリューションを見つけました。解決策の詳細はこちらです。https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Details_of_the_Object_Model - クラス構造は次のようになりました。

function A(p) {
 this.Position = p || new Vector2d(0,0);
}

function B(p) {
 this.base = A;
 this.base(p);
}
B.prototype = new A;

function C(p) {
 this.base = B;
 this.base(p);
}
C.prototype = new B;

if(C instanceof A)
  alert (' it worked!! '); // you now see this alert box!

これが機能しなかった理由を強調してくれたCMSに感謝します!!

http://8weekgame.shawson.co.uk/で完全なプロジェクトをチェックアウトできます (これを書いている時点ではまだこの新しい OO メソッドが完全に実装されていない古いビルドです)。私の最新の投稿をアウト。

于 2010-06-30T15:40:19.993 に答える