JS原型类,私有方法无法访问属性

时间:2015-12-22 17:17:30

标签: javascript prototype

我是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'时我做错了什么?

谢谢: - )

2 个答案:

答案 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上的构造函数中缺少
  1. scheduleItemService

  2. 您调用分配值的某些函数似乎没有返回任何内容。

     new createjs.Stage("lobbyCanvas");
     new ScheduledItemService
    
  3. 你的通话方式没问题。

    this始终引用调用对象。当你说...

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

    ...您的调用对象是lobby,其中包含start()函数所需的所有字段。但初始化似乎无法正常工作。

    请阅读MDN starter guide

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