具有私有方法的JS原型类不访问属性
JS prototype class with private methods not accessing properties
我是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"时我做错了什么??
谢谢:-)
在javascript中,this
不会根据声明/使用位置进行解析。它在被调用时得到解决。(请参阅:Javascript中的"this"关键字如何在对象文字中起作用?)。
因此,在上面的代码中,由于this
在对sendMessage()
的回调中被调用,并且sendMessage
是异步的(意味着回调将在对start()
的调用返回很久之后被调用),因此this
指的是全局对象(在web浏览器中是window
,在node.js中未命名)
因此,有效地,您的代码正在这样做(并非双关语):
sendMessage(data, function() {
renderLobbyImages(stage, scheduleItemService);
});
由于没有称为stage
或scheduleItemService
的全局变量,所以这两个变量实际上都是未定义的!
幸运的是,有一个解决办法。您可以在闭包中捕获正确的对象:
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));
或者在这种情况下,由于stage
和scheduleItemService
不是函数,您甚至可以直接传递它们:
sendMessage(data, (function(a,b){
return function(){
renderLobbyImages(a,b);
}
})(this.stage, this.scheduleItemService));
这个问题有很多解决办法。只要用你最舒服的。
两个问题。
-
scheduleItemService
上的构造函数中缺少this
。 -
您为赋值而调用的某些函数似乎没有返回任何内容。
new createjs.Stage("lobbyCanvas"); new ScheduledItemService
您的调用方法可以。
this
总是指调用对象。当你说。。。
varlobby = new Lobby();
lobby.start();
您的调用对象是lobby
,它具有start()
函数所需的所有字段。但那里的初始化似乎没有正常工作。
请阅读本MDN入门指南。
在这个问题上,我们还讨论了经典OOP和基于原型的OOP。有关我提到的教程的更多信息,请参阅Paul S的回答。如果你需要从经典OOP的角度看教程,请看我的答案。
- HTML5拖放访问属性
- 如何从保存在数组某个位置的JSON行访问属性
- webGL,javascript:尝试访问属性1中超出范围的顶点
- 访问属性的权限被拒绝'filepicker_comm_iframe'
- CanvasJS-访问变量-访问属性toString的权限被拒绝
- 错误:访问属性“”的权限被拒绝;文件”;
- 从javascript访问属性多端数组PHP
- 模块中的访问属性(CommonJS 样式)
- 从控制台 js 访问属性
- 相同的域,但仍收到“访问属性'文档'的权限被拒绝”
- 如何在 Javascript 中从函数本身或其副本访问属性
- 属性 Javascript 的访问属性
- 从 CoffeeScript 中类的属性中的方法访问属性的属性
- 通过 attrs.val 或 attrs.$set(attname, val)访问属性
- 使用 WinJS.Class 和访问属性
- Twitch TV API 访问属性名称值并更新它
- 如何访问属性名称中具有特殊字符的javascript对象的属性
- Cordova-不推荐尝试访问属性'userAgent'在非导航器对象上
- 具有私有方法的JS原型类不访问属性
- iFrame中的SelectionContext-访问属性“getSelection”的权限被拒绝