Javascript 原型模式和;这";

Javascript 原型模式和;这";,javascript,design-patterns,this,prototype-pattern,Javascript,Design Patterns,This,Prototype Pattern,我正在尝试使用Prototype模式为web控件创建客户端api。然而,我想让生活变得更轻松,不必管理“这个” 这是一些示例代码(我已经对有问题的行进行了注释): 通常,使用显示模块模式,我会声明一个私有变量: var that = this; 我可以对原型模式执行类似的操作吗?您可以执行与以前完全相同的操作,只需在doSomething方法中执行即可: doSomething: function () { var instance = this; $('.some-class

我正在尝试使用Prototype模式为web控件创建客户端api。然而,我想让生活变得更轻松,不必管理“这个”

这是一些示例代码(我已经对有问题的行进行了注释):

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

var that = this;

我可以对原型模式执行类似的操作吗?

您可以执行与以前完全相同的操作,只需在
doSomething
方法中执行即可:

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

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

您可以做与习惯完全相同的事情,只需在
doSomething
方法中执行即可:

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

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

ES5的
函数。prototype.bind()
可能是您的一个选项。你可以像

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

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

ES5的
函数。prototype.bind()
可能是您的一个选项。你可以像

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


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

那么又是什么问题呢?我想避免在管理“this”作用域时把代码弄得乱七八糟。@Poz很遗憾,如果你想避免管理
这个
,那你是在用错误的语言编程。我真的不明白你的问题。你期待什么?ECMAscript如何通过在同一范围内引用
this
两次来知道您指的是哪个对象?@AlexWayne这种约定不常见/不好吗?我倾向于在揭示模块/原型模式中做很多事情。。。那么问题又是什么呢?我想避免在管理“this”作用域时乱丢代码。@Poz遗憾的是,如果你想避免管理
this
,你是在用错误的语言编程。我真的不明白你的问题。你期待什么?ECMAscript如何通过在同一范围内引用
this
两次来知道您指的是哪个对象?@AlexWayne这种约定不常见/不好吗?我倾向于在揭示模块/原型模式中做很多事情。。。我想关键是他不想做你贴的事。他想要一个在所有方法中都可以访问的“that”,并指向正确的this<代码>当涉及嵌套功能范围时,需要管理此。没有办法绕过它。除非你想跳进咖啡脚本的胖箭头
=>
,但我尽量不在每个JS帖子中宣传咖啡脚本:pThanks Alex,我可以接受这个解决方案。然而,正如Matt指出的,如果我有一个“this”的引用,那就太好了。然后使用CoffeeScript,让编译器来处理它:)如果你在原型上附加方法,我认为这是唯一的解决方案。您可以在构造函数中定义方法,但这实际上浪费了大量内存:我认为关键是他不想做您发布的事情。他想要一个在所有方法中都可以访问的“that”,并指向正确的this<代码>当涉及嵌套功能范围时,需要管理此。没有办法绕过它。除非你想跳进咖啡脚本的胖箭头
=>
,但我尽量不在每个JS帖子中宣传咖啡脚本:pThanks Alex,我可以接受这个解决方案。然而,正如Matt指出的,如果我有一个“this”的引用,那就太好了。然后使用CoffeeScript,让编译器来处理它:)如果你在原型上附加方法,我认为这是唯一的解决方案。您可以在构造函数中定义方法,但这实际上会浪费大量内存: