0

これは紛らわしいように思えるかもしれませんが (またはそうではないかもしれません)、頭がおかしくなりました。したがって、基本的に宣言されたオブジェクトhospot型のクラス プロパティがあります。

Cannon.prototype.hotspot = {stuff: this.blah(...) };

現在、bla()メソッドは実際には「クラス」のプロトタイプでもあります。

Cannon.prototype.blah = function() { ... };

メソッド blah() が存在しないという問題が発生しました。これは、' this'がオブジェクトのホットスポットのコンテキストに関連しており、Cannonの「クラス」には関連していないためだと思います。今私が疑問に思っているのは、メソッド blah()をどのように呼び出すことができるかということです。

ちなみに、this.blah()をこれに置き換えてみました:

Cannon.prototype.blah.call(this, ...);

しかし、新たな問題があります。メソッド内のいくつかの変数が未定義であると言っています。メソッドには、クラスが絶対に持っていて定義されているthis.xのような変数がありますが、何らかの理由でそれを拾っていません。

みんな助けて。:) ありがとう

4

1 に答える 1

0

Thera は、大砲とホットスポットの 2 つのオブジェクトです。「Cannon.prototype.hotspot」の「{..}」はオブジェクト作成リテラルだからです。

それらを分離する必要があります。

function Cannon(hotspot) {
    if ( hotspot.constructor == Hotspot ) {
        this.hotspot = hotspot;
        // this.hotspot = new Hotspot();
        this.hotspot.setCannon(this);
    } else {
        throw "type mismatch: hotspot"
    }
}
// Less Flexible Constructor
// No need to pass "Hotspot" object
// function Cannon() {
//     this.hotspot = new Hotspot();
//     this.hotspot.setCannon(this);
// }

Cannon.prototype.blah = function(a){
    alert("Hello "+a);
};

function Hotspot() {
    this.cannon = null;
}
Hotspot.prototype.setCannon = function(cannon){
    if ( cannon.constructor == Cannon ) {
        this.cannon = cannon;
    } else {
        throw "type mismatch: cannon"
    }
};
Hotspot.prototype.stuff = function(a){
    if ( this.cannon ) {
        this.cannon.blah(a);
    }
};

これをテストできます:

var hotspot = new Hotspot();
var aCannon = new Cannon(hotspot);
aCannon.hotspot.stuff("World");

また

var aCannon = new Cannon( new Hotspot() );
aCannon.hotspot.stuff("World");
于 2013-10-31T07:26:11.327 に答える