function Objecte(name){
this.name=name;
}
Objecte.prototype.look=function(){
return function(){
alert(this.name);
};
}
我正在尝试访问Object的属性,但是当我调用该函数时,它会发出未定义的警报。
extintor = new Objecte("extintor");
$(document).on('dblclick',"#extintor",extintor.look());
答案 0 :(得分:1)
this
不是词法定义的。您需要捕获其值以确保返回的函数可以使用它。
Objecte.prototype.look=function(){
var self = this;
return function() {
alert(self.name);
};
}
您也可以使用$.proxy
Objecte.prototype.look=function(){
return $.proxy(function() {
alert(this.name);
}, this);
}
或.bind()
Objecte.prototype.look=function(){
return function() {
alert(this.name);
}.bind(this);
}
答案 1 :(得分:0)
您返回的匿名函数具有另一个this
的上下文。
因此,您有两种选择:
<强> 1。在外部创建对this
的引用,并在匿名函数中使用
Objecte.prototype.look = function() {
var objecteInstance = this;
return function() {
alert(objecteInstance.name);
};
}
<强> 2。使用所有主流浏览器支持的Function.prototype.bind
,包括IE9 +
Objecte.prototype.look = function() {
return function() {
alert(this.name);
}.bind(this);
}
如果您不需要支持IE8及更低版本,那么第二个选项就是 - 对我来说它看起来更优雅。
答案 2 :(得分:0)
看起来需要返回一个函数吗?我想你要做的是:
Objecte.prototype.look=function(){
alert(this.name);
}
但是,在执行该函数时,此上下文中的this
将被解析,并且可以绑定到另一个对象。我认为在任何情况下使用对象的闭包声明而不是使用原型都更清楚。你可以用这种方式声明你的对象:
function Objecte(name) {
var that = this;
this.name = name;
this.look = function() {
alert(that.name);
}
}
缺点是Objecte类型的每个对象都有自己的函数外观副本,但是最后一次内存不足的时候是什么时候? 另一个缺点是你不能从另一个对象继承,重写一个方法,然后从这个对象中调用原始方法,因为它会丢失。但不利的是......