2015-12-22 51 views
0

我是新来的JS,特别是原型。 我有这个类,我不知道如何访问属性。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'?

谢谢:-)

+5

您是否收到任何错误..?哪里不对..? –

+1

你怎么调用'start()'? – Barmar

+2

请告诉我们你是如何使用构造函数的,以及你如何调用'.start'。 – Teemu

回答

4

在javascript中,this未根据其声明/使用位置进行解析。它被调用时解析。 (见:How does the "this" keyword in Javascript act within an object literal?)。

因此,在上面的代码中,由于this被称为在回调至sendMessage(),并且由于sendMessage是异步(意味着回调将长调用start()已经返回之后调用),因此this指的是全球对象(在web浏览器中为window,在node.js中未命名)。

那么有效,你的代码是这样做的(没有双关语意):

sendMessage(data, function() { 
    renderLobbyImages(stage, scheduleItemService); 
}); 

由于没有叫stagescheduleItemService全局变量都是有效未定义!

幸运的是,这有一个解决方法。您可以捕捉到正确的对象在一个封闭:

var foo = this; 
sendMessage(data, function() { 
    renderLobbyImages(foo.stage, foo.scheduleItemService); 
}); 

或者,您可以通过正确的对象(this)到IIFE:

(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)); 

还是在这种情况下,由于stagescheduleItemService不是功能,你甚至可以直接通过它们:

sendMessage(data, (function(a,b){ 
    return function(){ 
     renderLobbyImages(a,b); 
    } 
})(this.stage, this.scheduleItemService)); 

这个问题有很多解决方案。只要使用你最舒服的那个。

+0

非常感谢 - 你肯定会钉上它! – Shvalb

0

两个问题。

  1. this缺少在构造函数上scheduleItemService

  2. 你调用一些函数来分配值似乎没有返回任何东西。

    new createjs.Stage("lobbyCanvas"); 
    new ScheduledItemService 
    

您的调用方法是好的。

this总是指主叫对象。当你说...

varlobby = new Lobby(); 
lobby.start(); 

...您的通话对象是lobby它具有start()功能需要的所有字段。但是初始化似乎不能正常工作。

请阅读此MDN starter guide

此外,我们在this问题中对经典和基于原型的OOP进行了一些讨论。有关我提到的教程的更多信息,请参阅answer of Paul S。如果您需要在古典OOP灯光中查看教程,请参阅my answer

+0

你可以看看我最近的编辑。 – Shvalb

+0

你的构造函数没问题。而且你正确地调用它。唯一的可能性是'createjs.Stage'和'ScheduledItemService'不按预期创建属性。所以,他们是'未定义的'。请在那里设置一个断点,并在控制台中查看这些功能是否正常工作。 –

+0

我知道什么是问题,但我不知道如何解决它。如果我直接从.start()方法调用方法,而不是定义所有东西。 *但如果我在'sendMessage'方法的内部函数中调用方法 - 那么它是未定义的! – Shvalb