6

後でプロトタイプでより深く使用するために、最上位のスコープをキャッシュする方法は次のとおりです。

var Game = function(id){
   this.id = id;
};

Game.prototype = {
  board : {
    init: function(){
       // obviously "this" isn't the instance itself, but will be "board"
       console.log(this.id);
    }
  }
}

var game = new Game('123');
game.board.init(); // should output "123"

アップデート:

さて、考えてみると、apply/を使用callしてコンテキストを渡すことができます...

game.board.init.apply(game);
4

5 に答える 5

2

オブジェクトのインスタンスは 1 つしかboardないため、アクセスに何を使用したかを知る方法はありません。game.boardまたはを使用Game.prototype.boardしてオブジェクトにアクセスすると、まったく同じ結果が得られます。

インスタンスboardごとに1 つのオブジェクトを作成したくない場合は、呼び出しごとにどのオブジェクトに属していると見なすかをオブジェクトに指示する必要があります。GameboardGame

game.board.doSomething(game);

また:

Game.prototype.board.doSomething(game);

編集:

インスタンスごとに 1 つのボードを作成するGameには、 のコンストラクタをBoard作成し、ボード オブジェクトがGame属するインスタンスを認識するようにします。

function Game(id) {
  this.id = id;
  this.board = new Board(this);
}

Game.prototype = {
};

function Board(game) {
  this.game = game;
}

Board.prototype = {
  init: function(){
    console.log(this.game.id);
  }
};

var game = new Game('123');
game.board.init(); // outputs "123"
于 2013-05-11T23:26:08.980 に答える
1

「プロトタイプの奥深く」などというものはありません。「this」は、コールバックまたは再バインドするさまざまな方法によって変更されない限り、常に呼び出しているオブジェクトになります。概念を分割してそれらをリンクすると、正気度の低下が少なくなります。

Board = function (game) {
    this.game = game;
}

Board.prototype.init = function () {
    console.log(this.game.id);
}

Game = function () {
    this.id = 123;
    this.board = new Board(game);
}

Game.prototype = {};

または、すべて同じベースを使用することに夢中になっている場合は、次のようなクレイジーなハックを行うことができます..

Game = function () {
    this.id = 123;
    var self = this;
    for(var p in this.board) {
        var property = this.board[p];
        if(typeof property == 'function') {
            this.board[p] = function (method) {
                return function () {
                    method.apply(self, arguments);
                }
            }(property)
        }
    }
}

これは完全なハックであり、同僚はあなたを嫌うでしょう。(アンダースコア ライブラリを使用している場合は、この作業に役立つ bindAll 関数があります)

于 2013-05-11T23:08:01.550 に答える