我有一个班级Gadget
,其中一个方法consider
定义为:
function Gadget() {
this.consider = function (arg) {
alert(arg);
};
if ("WebSocket" in window) {
var ws = new WebSocket(...);
// the rest truncated
ws.onmessage = function (evt) {
consider(evt.data);
};
}
}
但是,由于consider
失败,我无法让TypeError
工作。
Uncaught TypeError: Object #<Gadget> has no method 'consider'
如果我尝试使用this.consider
,则TypeError
会出现在 WebSocket 对象中。如果我尝试parent.consider
,那么 Object 对象会给我同样的错误。
现在我的解决方法是使用声明的实例中的方法,如:
var player = new Gadget();
并改为使用player.consider(evt.data)
。我不喜欢这样做,但它有效。如何重新排列代码,使其不依赖于对象的已定义实例?
答案 0 :(得分:3)
有两种方法可以解决这个问题。
1)使用私人功能
function Gadget() {
function consider(arg){
alert(arg);
}
this.consider = consider;
if ("WebSocket" in window) {
var ws = new WebSocket(...);
// the rest truncated
ws.onmessage = function (evt) {
consider(evt.data);
};
}
}
这样,您在consider()
类中有一个私有的Gadget
函数,即使它的实例调整了自己的consider
方法(例如var x=new Gadget(); x.consider=...
),网络套接字仍然可以按预期工作;
2)“缓存”this
function Gadget() {
this.consider = function(arg){
alert(arg);
};
if ("WebSocket" in window) {
var ws = new WebSocket(...);
// the rest truncated
var self=this;
ws.onmessage = function (evt) {
self.consider(evt.data);
};
}
}
这样,您的Web套接字事件将始终使用小工具的实例{/ 1}}。
Here is a jsfiddle demo展示了这两种方式。请注意,我故意调整了consider
实例的consider
方法(第二个按钮)。单击这些按钮以查看不同的内容。