0

我正在尝试使用原型模式为 Web 控件创建客户端 api。但是,我想通过不必管理“这个”来让生活更轻松。

这是一些示例代码(我已经评论了有问题的行):

MyObject = function ()
{
    MyObject.initializeBase(this);

    this._someProperty = null;
};    

MyObject.prototype = {

    initialize: function()
    {
        // Init
    },

    get_someProperty: function()
    {
        return this._someProperty;
    },

    set_someProperty: function(value)
    {
        this._someProperty = value;
    },    

    doSomething: function ()
    {
        $('.some-class').each(function ()
        {
            $(this).click(this.doClick);  // this.doClick is wrong
        });
    },

    doClick: function ()
    {
        alert('Hello World');
    }
};

通常,使用显示模块模式我会声明一个私有变量:

var that = this;

我可以用原型模式做类似的事情吗?

4

2 回答 2

4

你可以做你习惯做的完全相同的事情,只需在doSomething方法中做:

doSomething: function ()
{
    var instance = this;
    $('.some-class').each(function ()
    {
        $(this).click(instance.doClick);
    });
},

这种方法与prototype与否无关,它只是如何使用嵌套函数管理上下文。因此,当原型(方法)上的函数在 in 中具有嵌套函数时,this如果您想在嵌套范围内访问它,则可能必须在任何这些级别保留上下文。

于 2012-08-09T16:27:59.980 回答
0

ES5Function.prototype.bind()可能是您的选择。你可以去

doSomething: function ()
{
    $('.some-class').each(function(_, node)
    {
        $(node).click(this.doClick);  // this.doClick is right
    }.bind(this));
},

现在,我们通过调用代理每个事件处理程序,.bind()因此,我们在原型对象的上下文中调用它。这里需要注意的是,您不再需要this引用实际的DOM 节点,因此我们需要使用从 jQuery 传入的参数。

于 2012-08-09T16:44:07.560 回答