Javascript实例上下文原型

时间:2013-07-08 19:30:08

标签: javascript this

抱歉没有那么好的主题标题。不知道如何命名。

我需要这个例子的帮助,我完全迷失了。

所以当函数fillView调用它时一切都很好,但第二次调用它时重新调整它只是不起作用,因为在渲染函数内部'this'定义了一个Window,而不是localClass的一个实例。我需要解释如何找出这个问题。请写一个例子。

(function ($) { 
var localClass = function(options) {
    this.a = 123;
};

localClass.prototype.render = function() {
    console.log(this.a);
}

$.fn.fillView = function(options){
    var view = new localClass(options);
    view.render(); //this prints to console 123

    $(window).resize(view.render); //this doesn't print 123 
                                     because 'this' is now - Window

    }
})(jQuery)

1 个答案:

答案 0 :(得分:3)

替换

$(window).resize(view.render);

$(window).resize(function(){view.render()});

如果您只定位新浏览器(即您不需要与IE8兼容),您也可以使用bind

$(window).resize(view.render.bind(view));

工作原理:

1)当您传递函数时,您只需将另一个属性的值设置为该函数。这就像在做

var f = view.render.

当调用此函数时,会调用它,例如:

f(); 

可能更清楚的是,this在函数中没有理由成为view。事实上,window就是这样。更准确地说,this,在函数中,不是函数的初始“所有者”,而是接收者,这取决于你调用函数的方式。

事实上,它可能是另一个对象:如果你执行

f.call(someObject)

然后this frender)中的someObject将为var f = function(){ view.render() }

2)但是当你传递一个

的函数时
f

然后调用render的方式无关紧要,因为调用view并将bind作为接收方。

3)还有其他解决方案:$.proxythis都会构建一个嵌入您的新功能,但确保{{1}}始终是您传递的对象。