0

重複の可能性:
Crockford's Prototypal inheritance - ネストされたオブジェクトの問題

プロトタイプ A からプロトタイプ B の関数を実行する次のコードを取得するのに問題があり、簡単な解決策があるかどうか疑問に思っていました。

var Ob = function () {
  test = 'hi';
}

Ob.prototype.A = {
  that : this,
  root : this,
  goB : function () {
    var that = this;

    console.log('hello');
    that.B.wtf();
  }
}

Ob.prototype.B = {
  that : this,
  root : this,
  wtf : function () {
    var that = this;

    console.log(that);
  }
}

test = new Ob;
test.A.goB();
4

2 に答える 2

2

Aオブジェクト リテラルとBを のプロトタイプに割り当てるObと、いくつかのメソッドを含む 2 つのオブジェクト リテラルがプロトタイプに配置されます。プロトタイプにメソッドを配置していません。testしたがって、 instanceのコンテキストでこれらのオブジェクト リテラルに対してそのメソッドを実行すると、thisそれが意味することは意味しません。

于 2012-11-07T13:55:22.527 に答える
1

オブジェクトが作成された後、プロパティを接続する必要があります。

var Ob = function () {
    var that = this;

    // set the current root to this instance and return the object
    this.getA = function() {
        that.A.currentRoot = that;
        return that.A;
    };

    this.getB = function() {
        that.B.currentRoot = that;
        return that.B;
    };
};

Ob.prototype.A = {
    goB : function () {
        var that = this.currentRoot;

        console.log('hello');
        that.getB().wtf();
    }
};

Ob.prototype.B = {
    wtf : function () {
        var that = this.currentRoot;

        console.log(that, this);
    }
};


test = new Ob;
test.getA().goB();

やや汚いハックは、親オブジェクトで特権メソッドを使用して子オブジェクトを拡張し、それを返すことです。これにより、プロパティを介して親オブジェクトにアクセスできるようになります。汚い部分は、オブジェクトをキャッシュすると、プロパティが正しい値を持つことが保証されないことです。したがって、これは多かれ少なかれそれを行う方法ですが、実際にはこの方法で行うべきではありません。

于 2012-11-07T13:57:23.863 に答える