首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不访问属性的私有方法的JS原型类

不访问属性的私有方法的JS原型类
EN

Stack Overflow用户
提问于 2015-12-22 17:17:29
回答 2查看 73关注 0票数 0

我对JS特别是原型机很陌生。我有这个类,我不知道如何访问这些属性。

代码语言:javascript
运行
复制
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();
};

呼叫代码:

代码语言:javascript
运行
复制
var lobby = new Lobby(preloader, serverConn);
lobby.start(me, status.authResponse.signedRequest);

我访问'renderLobbyImages‘做错了什么??

谢谢:-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-22 18:11:28

在javascript中,this不是根据声明/使用的位置来解析的。当它被调用时就会被解析。(见:Javascript中的"this“关键字是如何在对象文字中起作用的?)。

因此,在上面的代码中,由于this是在对sendMessage()的回调中调用的,而且由于sendMessage是异步的(这意味着回调将在对start()的调用返回后很长时间内被调用),因此this是指全局对象(在web浏览器中是window,在node.js中没有命名)。

因此,实际上,您的代码正在执行此操作(没有双关语的意思):

代码语言:javascript
运行
复制
sendMessage(data, function() {
   renderLobbyImages(stage, scheduleItemService);
});

由于没有名为stagescheduleItemService的全局变量,因此两者实际上都是未定义的!

幸运的是,有一个解决办法。可以在闭包中捕获正确的对象:

代码语言:javascript
运行
复制
var foo = this;
sendMessage(data, function() {
   renderLobbyImages(foo.stage, foo.scheduleItemService);
});

或者,您可以将正确的对象(this)传递给IIFE:

代码语言:javascript
运行
复制
(function(x){
    sendMessage(data, function() {
        renderLobbyImages(x.stage, x.scheduleItemService);
    });
})(this); // <-------- this is how we pass this

或者:

代码语言:javascript
运行
复制
sendMessage(data, (function(a){
    return function(){
        renderLobbyImages(a.stage, a.scheduleItemService);
    }
})(this));

或者在这种情况下,由于stagescheduleItemService不是函数,您甚至可以直接传递它们:

代码语言:javascript
运行
复制
sendMessage(data, (function(a,b){
    return function(){
        renderLobbyImages(a,b);
    }
})(this.stage, this.scheduleItemService));

这个问题有很多解决办法。就用你最舒服的那个。

票数 4
EN

Stack Overflow用户

发布于 2015-12-22 17:43:41

两个问题。

  1. this缺少在scheduleItemService上的构造函数中。
  2. 您调用的一些赋值函数似乎没有返回任何内容。 新createjs.Stage("lobbyCanvas");新ScheduledItemService

你的呼叫方法没问题。

this总是引用调用对象。你说..。

代码语言:javascript
运行
复制
varlobby = new Lobby();
lobby.start();

..。您的调用对象是lobby,它具有start()函数所需的所有字段。但是,初始化似乎不能正常工作。

请阅读这个MDN启动器导轨

另外,我们还对问题中的经典和基于原型的面向对象操作进行了一些讨论。有关我提到的教程的更多信息,请参见保罗S的答覆。如果您需要阅读经典OOP中的教程,请参阅我的回答

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34421190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档