我剛開始在javascript中使用oop,我遇到了一些問題,試圖從另一種方法中訪問一個方法。JavaScript對象,自引用問題
這裏是我的代碼:
var Game = {
initialize: function() {
if (canvas.isSupported()) {
sprites[0] = new Player();
this.update();
}
},
update: function() {
for (var i = 0; i < sprites.length; i++) {
sprites[i].update();
}
this.draw();
},
draw: function() {
this.clear();
for (var i = 0; i < sprites.length; i++) {
sprites[i].draw();
}
setTimeout(this.update, 10);
},
clear: function() {
canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}
}
但在調用Game.update()給出的是牽引方法沒有定義的錯誤。 我找不到一個真正的解決方案。 最終我發現這個How to call a method inside a javascript object 其中的答案似乎是,我需要安全這個參考文獻,如: var _this = this;
但我無法得到那個在文字符號的工作,所以我改變了代碼,對象構造函數(我猜這就是它的調用方式)並添加了變量。
我再改
this.draw();
到
_this.draw();
和它的工作。
雖然
this.clear();
和this.update()仍然是相同的,他們似乎從來沒有放棄在首位的錯誤。
任何人都可以解釋爲什麼這是?也許可以指點我一個更好的解決方案? 在此先感謝。
更新
下面是它應該是什麼:
var Game = function() {
var _this = this;
this.initialize = function() {
if (canvas.isSupported()) {
sprites[0] = new Player();
this.update();
}
}
this.update = function() {
for (var i = 0; i < sprites.length; i++) {
sprites[i].update();
}
this.draw();
}
this.draw = function() {
this.clear();
for (var i = 0; i < sprites.length; i++) {
sprites[i].draw();
}
setTimeout(function() { _this.update(); }, 10);
}
this.clear = function() {
canvas.context.clearRect(0, 0, canvas.element.width, canvas.element.height);
}
}
你能展示完整的代碼嗎? – 2011-03-17 13:30:13
+1,真是太棒了,併發布您的更新。這篇文章最後闡述了備用命名空間方法的不同之處。你今天讓我成爲了一個更好的編碼器。 :) – Evildonald 2012-11-16 06:26:01