2011-12-18 67 views
1

我有一些构造函数具有一些属性和原型。但是,由于某种原因,我无法访问原型函数中的属性。无法访问构造函数中的属性

下面是一些代码(简化了代码,使其可读),以向您展示我的意思。在'renderTiles'函数中我可以访问'pairs',但是在'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... 
} 

回答

2

这是因为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,除非你在循环。

+0

感谢您的回答。我尝试了“var self = this”,但在控制台中得到以下错误消息:“Uncaught TypeError:Object [object DOMWindow] has no method'addEventHandler'”。 – holyredbeard 2011-12-18 17:11:55

+0

我也更新了代码,使其更加清晰。 – holyredbeard 2011-12-18 17:12:16

+0

@JasonCraig:那是因为你需要'self.addEventHandler'和'self.turnTile'。你有'this.addEventHandler'和'this.turnTile'。 – RightSaidFred 2011-12-18 17:17:44

相关问题