2

Flash/AS3.0 で設計したゲームを JavaScript に書き直していますが、クラスを学んだ後、プロトタイプに頭を悩ませています。私はそれについてたくさんの情報を読みましたが、このシナリオにどのように適用するかまだよくわかりません.

だから...私のAS3.0プロジェクトには、ゲームのすべてのレベルで何が起こるか、Enter_Frame機能などの根性を持ったレベルクラスがありました。次に、次のようなレベル固有の詳細のために、各レベルでそのクラスを拡張しましたアイテムの配置、地形の詳細など...私の質問は、これを行うための最も効率的で「適切な」方法はどのようにするかです。

現在、私は2つの機能を持っています:

function level() {
//generic level functionality
}

function level1() {
//level1 specific functionality
}

次に、私が読んだように、設定する必要がありました

level1.prototype = new level();

しかし、これは実行時にレベル関数内のすべてを実行することがわかりました。これは望ましくありません。理想的には、開始ボタンで level1 をインスタンス化し、level1 に level のプロパティとメソッドを持たせたいと考えています。また、可能であれば、これが発生したときに level1 とレベルのコンストラクター内ですべてを実行します...可能ですか?

当然のことだと思いますが、クリックできないようです。ばかげた質問をしている場合は申し訳ありません。事前にどんな助けにも感謝します。

4

4 に答える 4

2

継承を確立するときにコンストラクターを実行しないようにするには、次を使用できますObject.create()

level1.prototype = Object.create(level.prototype);

ただし、コンストラクター呼び出しを「チェーン」するには、次のことも行う必要があります。call levellevel1

function level1() {
    level.call(this);

    // ...
}

using を使用callすると、コンテキスト ( this) を渡すことができるため、両方のコンストラクターが同じオブジェクトで動作します。

于 2013-07-11T08:41:34.507 に答える
0

あなたが達成しようとしているのは、JavaScript でのある種のオブジェクト指向ソリューションです。このブログ投稿を見てください。詳しく説明されており、良い例も示されています。:-)

于 2013-07-11T08:37:07.980 に答える
0

親コンストラクターは、 を使用して呼び出すことができますObj.call(this,args)level1コードはのプロトタイプの割り当ても保持する必要がありlevel1.prototype = new level()ます。これにより、2 つのオブジェクト間に継承のような関係が作成されるためです。

function level(config) {
    if(config){
       this.someProperty = config.prop;
       alert("Level constructor");
       alert("Level property " + this.someProperty);
    }
}

function level1(config) {
   level.call(this, config);
   this.someProperty2 = config.prop2;
   alert("Level1 Construtor");
   alert("Leve1 property " + this.someProperty2);
   alert("Level1 using prop from level " + this.someProperty);
}

level1.prototype = new level();

var myLevel = new level1({
    prop: "Test prop",
    prop2: "Test prop2"
});

作業例 http://jsfiddle.net/kz2Xc/1/

于 2013-07-11T08:39:23.993 に答える
0

ユーザー JonathanLonowski は、継承の設定時に構造の呼び出しを回避する方法についての質問に既に回答しています。しかし、あなたの質問は、JavaScript で継承がどのように機能するかについての一般的な質問でもあります。したがって、このトピックを説明するための私の試みは次のとおりです。

継承に関して言えば、基本的にやりたいことは、プロトタイプ チェーンを強化することです。

それで、プロトタイプチェーンは何ですか?

ie を使用してオブジェクトのプロパティを要求するとobj.prop、JavaScript はまずオブジェクトobjにそのようなプロパティがあるかどうかを確認します。そうでない場合は、そのオブジェクトのプロトタイプにそのようなプロパティがあるかどうかを確認します。そうでない場合は、プロトタイプのプロトタイプにそのようなプロパティがあるかどうかなどを確認します。

コンストラクター関数を使用して新しいオブジェクトを作成するとobj = new B()、プロトタイプ チェーンは次のようになります。

obj -> B.prototype -> Object -> null

継承がプロトタイプ チェーンでどのように機能するか

Bオブジェクトが type のオブジェクトから継承されるようにするにはA、プロトタイプ チェーンを次のようにします。

obj -> B.prototype -> A.prototype -> Object -> null

これを実現するには、 の後にプロトタイプ チェーンを「分割」し、B.prototype代わりに の完全なプロトタイプ チェーンを挿入しAます。つまり、B.prototypeを指すように設定しA.prototypeます。

前に行ったように、これを行うことができます。

B.prototype = new A();

では、なぜこれが機能するのでしょうか。によって作成されたオブジェクトにnew A()は、次のプロトタイプ チェーンがあります。

objA -> B.prototype -> Object -> null

このオブジェクトでオーバーライドB.prototypeすると、型のオブジェクトのプロトタイプ チェーンはB次のようになります。

objB -> objA -> A.prototype -> Object -> null

ご覧のとおり、機能します。単にオーバーライドB.prototypeするだけで、プロパティのようないくつかのプロパティが失われconstructorます。したがって、constructorで型のオブジェクトのを取得しようとするBobjB.constructor、最初にオブジェクト自体を調べて見つからず、次に調べて見つけられず、次に調べてobjAfindA.prototypeを検索しますがA、これは間違っています。プロパティが頻繁に必要になるわけではありませんが、constructorオーバーライド後に再度設定することをお勧めしますB.prototype

B.prototype = new A();
B.prototype.constructor = B;

さて、あなたの方法は、プロトタイプ チェーンのリンクを実現するための 1 つの方法にすぎません。JonathanLonowski による解決策は別のものであり、 function を呼び出さないため、実際にはより優れたものAです。type のオブジェクトと同じプロトタイプ チェーンを持つ空のオブジェクトを作成しますA

(empty object) -> A.prototype -> Object -> null

別の解決策は、オーバーライドせずに変更して、の代わりにB.prototype単純に指すようにすることです。すべてのブラウザーがこれをサポートしているわけではありませんが、一部のブラウザーでは、プロパティを設定することでこれを実現できます。A.prototypeObject__proto__

B.prototype.__proto__ = A.prototype;

これにより、次のプロトタイプ チェーンが生成されます。

obj -> B.prototype -> A.prototype -> Object -> null

あちこちで単純化したことに注意してください。ただし、これにより、それがどのように機能するかがわかると思います。理解すべき非常に基本的なことは、プロトタイピングです。現在、技術的には、すべてのオブジェクトが持つ真のプロトタイプ プロパティは 1 つだけであり、それが内部[[prototype]]プロパティです。JavaScript で直接アクセスすることはできませんが、特定の条件下で設定および操作する必要が.prototypeあります。.__proto__

于 2013-07-11T09:53:35.670 に答える