Не удается получить доступ к свойству в функции конструктора - PullRequest
1 голос
/ 18 декабря 2011

У меня есть функция конструктора с некоторыми свойствами и прототипами.Однако по какой-то причине я не могу получить доступ к свойствам одной из функций прототипа.

Ниже приведен некоторый код (сокращенный код, чтобы его можно было прочитать), просто чтобы показать вам, что я имею в виду.В функции renderTiles я могу получить доступ к парам, а в turnTile - нет.Есть ли очевидная причина для этого или это невозможно выяснить с помощью моего сокращенного кода?

ОБНОВЛЕНИЕ: обновлен код, чтобы сделать его более понятным ...

DESKTOP.Game = function(){
    this.pairs = 0;
}

DESKTOP.Game.prototype.renderTiles = function() {

console.log(this.pairs); <- undefined

var gamearea = $('<div/>', {
    'text': 'testarea',
    'class': 'gamearea'
}).appendTo('.memory:last');

alert("this.rows: " + this.rows);

for (var j = 0; j < this.rows; j++){
    var box = document.createElement('div');
    for (var i = 0; i < this.cols; i++){

        var iterator = (this.cols * j) + i;

        var img = document.createElement('img');
        var aNod = document.createElement('a');

        aNod.href = "#";
        img.src = "pics/memory/0.png";

        aNod.appendChild(img);
        box.appendChild(aNod);

        var self = this;
        (function(place, index) {
            this.addEventHandler(aNod, 'click', function() { this.turnTile(place, index); return false; });
        })(iterator, this.imgArray[iterator]);
    }   
    gamearea[0].appendChild(box);
}
}

DESKTOP.Game.prototype.turnTile = function(place, id) {
    console.log(this.pairs); <- undefined

// removed code...
}

1 Ответ

2 голосов
/ 18 декабря 2011

Это потому, что значение this зависит от как вы звоните turnTiles.

Потому что вы делаете:

DESKTOP.Game.prototype.turnTile(place, index)

... значение this будет объектом prototype, но pairs помещается на каждый отдельный объект, созданный из Game, а не на prototype.

Понятия не имею, как вы звоните renderTiles, но я бы предположил, что вы создали экземпляр Game и вызвали его оттуда.

Не зная, как работает ваш код, я просто догадываюсь, что вы хотите, чтобы addEventHandler также вызывался для экземпляра.

Если это так, вы должны заменить это:

(function(place, index) {
    DESKTOP.Game.prototype.addEventHandler(aNod, 'click', function() { DESKTOP.Game.prototype.turnTile(place, index); return false; });
})(iterator, this.imgArray[iterator]);

с этим:

var self = this;
(function(place, index) {
    self.addEventHandler(aNod, 'click', function() { self.turnTile(place, index); return false; });
})(iterator, this.imgArray[iterator]);

или что-то.

Хотя я не уверен, почему вы используете IIFE здесь, если вы не в цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...