如何确保返回的对象文字中的方法调用使用预期的" this"

时间:2015-06-15 16:50:13

标签: javascript

我有一个javascript函数,它有许多方法和变量,并返回一个我有点像类的对象文字,即

var myObject = function {

   var somevars;
   var someMethod = function(someInput) { };

   return {
      methodA:function(inputs) { 
        // calls someMethod, using somevars and inputs 
      },
      methodB:function(inputs) { 
        // calls someMethod, using somevars and inputs 
      }

   };
}

在javascript中,通常会创建一个名为"的变量"或者"自我"或者某种存储"这个"的价值的东西。在创建时,以便将来可以使用它来指向对象自己,因为"这个"可能指向别的东西。如果,例如,这是有用的。 methodA用作点击处理程序。

我如何创建"那"我返回的对象文字中的变量?

是否有一种很好的方法来初始化""对象文字中的变量,还是更必要的东西?

更新

是的,我希望能够引用的对象是对象文字本身。

是的,methodA和methodB也可能相互调用并引用返回的对象文字的其他成员。这就是为什么我关心"这"。

我通过" new"创建了这个对象的一些实例。调用其中一个X.然后我想使用X.methodA作为鼠标事件处理程序,例如我有jquery代码将dom元素上的mouseup附加到X.methodA。但这看起来像是$("#domElementId")。mousemove(X.methodA)但是当调用mousemove时," this"正如我所理解的,方法A中使用的变量不再指向X.如果我错了,请随意纠正我。具体来说,方法A中的调用,比如方法B,将会失败,因为它们已经使用this.methodB和"""指向全局对象。

3 个答案:

答案 0 :(得分:6)

如果你想"绑定"对象的函数,你需要引用函数内部的对象,这意味着你必须将它赋给变量:

var obj = {
    methodA: function() {
      // use obj here
    }
};
return obj;

但是,只有在methodA实际引用对象中的任何其他属性时才需要这样做。

如果您只访问评论中提到的内容,则无需进行此操作。无论函数如何调用,您都可以访问someMethodsomevarsinputs,因为它们是词法范围的。

答案 1 :(得分:0)

当你说new myObject()时会发生这种情况:

  1. JS创建一个新对象。
  2. JS指定myObject作为新对象的原型。
  3. JS运行myObject函数,并将新对象绑定到函数范围内的this
  4. new表达式求值为步骤1中创建的对象,除非myObject函数调用返回了一个对象(就像你在这里一样)。
  5. 通常在使用new调用函数时,该函数应设置this对象,而不是创建新对象。

    因此,将方法附加到对象应该做的是修改this或使用原型继承来附加方法。第一种方法看起来像这样:

    function myObject() {
        var somevars;
    
        this.methodA = function(inputs) { /* ... */ }.bind(this);
        this.methodB = function(inputs) { /* ... */ }.bind(this);
    }
    

    然后,在方法函数中,您可以使用this来引用最初绑定方法的对象。

    由于您需要使用私人数据somevars,因此您无法(轻松)使用原型方法;分配给原型的函数都在对象实例之间有效共享,而在上面的方法中,您为myObject的每个实例创建新的函数对象,这意味着它们每个都可以访问somevars的不同实例。

    (请注意,只要您不介意将方法的函数引用复制到另一个对象,this将改为引用其他对象,那么绑定函数并不是绝对必要的。通过该对象调用函数时的对象。是否应该使用bind()取决于应用程序的其他详细信息,因此我无法明确告诉您是否需要在此处使用它。)

答案 2 :(得分:-1)

您可以使用var myObject = function() { var somevars; var someMethod = function(someInput) { }; this.foo = "bar"; return { methodA:function(inputs) { // calls someMethod, using somevars and inputs //you can use the this.foo }.bind(this), methodB:function(inputs) { // calls someMethod, using somevars and inputs }.bind(this) }; } ...

import java.nio.file.FileSystem;
import java.nio.file.FileSystems;