在JS中返回对象属性时出错

时间:2013-05-13 17:45:25

标签: javascript jquery oop prototype

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());

3 个答案:

答案 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类型的每个对象都有自己的函数外观副本,但是最后一次内存不足的时候是什么时候? 另一个缺点是你不能从另一个对象继承,重写一个方法,然后从这个对象中调用原始方法,因为它会丢失。但不利的是......