我是JS的新手,尤其是原型。 我有这个类,我无法弄清楚如何访问属性。
var Lobby = function (preloader, serverConn) {
// Hold a reference to EventBus
this.serverConn = serverConn;
this.preloader = preloader;
this.scheduleItemService = new ScheduledItemService(this.preloader);
this.stage = new createjs.Stage("lobbyCanvas");
};
Lobby.prototype.start = function(me, signedRequest) {
sendMessage(data, function() {
// inside this scope this.stage is undefined!
renderLobbyImages(this.stage, this.scheduleItemService);
});
};
function renderLobbyImages(stage, scheduleItemService) {
stage.update();
};
致电代码:
var lobby = new Lobby(preloader, serverConn);
lobby.start(me, status.authResponse.signedRequest);
访问'renderLobbyImages'时我做错了什么?
谢谢: - )
答案 0 :(得分:4)
在javascript中,this
未根据声明/使用的位置解析。它在被调用时被解析。 (见:How does the "this" keyword in Javascript act within an object literal?)。
因此,在上面的代码中,由于在this
的回调中调用sendMessage()
,因为sendMessage
是异步的(意味着在调用{之后很长时间调用回调) {1}}已返回),start()
因此引用全局对象(在Web浏览器中为this
,在node.js中未命名)。
如此有效,您的代码正在执行此操作(无双关语):
window
由于没有名为sendMessage(data, function() {
renderLobbyImages(stage, scheduleItemService);
});
或stage
的全局变量,因此两者都未定义!
幸运的是,有一个解决方法。您可以在闭包中捕获正确的对象:
scheduleItemService
或者,您可以将正确的对象(var foo = this;
sendMessage(data, function() {
renderLobbyImages(foo.stage, foo.scheduleItemService);
});
)传递给IIFE:
this
或:
(function(x){
sendMessage(data, function() {
renderLobbyImages(x.stage, x.scheduleItemService);
});
})(this); // <-------- this is how we pass this
或者在这种情况下,由于sendMessage(data, (function(a){
return function(){
renderLobbyImages(a.stage, a.scheduleItemService);
}
})(this));
和stage
不是函数,您甚至可以直接传递它们:
scheduleItemService
这个问题有很多解决方案。只需使用您最熟悉的那个。
答案 1 :(得分:0)
两个问题。
this
上的构造函数中缺少 scheduleItemService
。
您调用分配值的某些函数似乎没有返回任何内容。
new createjs.Stage("lobbyCanvas");
new ScheduledItemService
你的通话方式没问题。
this
始终引用调用对象。当你说...
varlobby = new Lobby();
lobby.start();
...您的调用对象是lobby
,其中包含start()
函数所需的所有字段。但初始化似乎无法正常工作。
我们还在this问题中讨论了基于经典和原型的OOP。有关我提到的教程的更多信息,请参阅answer of Paul S。如果您需要在经典OOP灯光中查看教程,请参阅my answer。