我有一个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和"""指向全局对象。
答案 0 :(得分:6)
如果你想"绑定"对象的函数,你需要引用函数内部的对象,这意味着你必须将它赋给变量:
var obj = {
methodA: function() {
// use obj here
}
};
return obj;
但是,只有在methodA
实际引用对象中的任何其他属性时才需要这样做。
如果您只访问评论中提到的内容,则无需进行此操作。无论函数如何调用,您都可以访问someMethod
,somevars
和inputs
,因为它们是词法范围的。
答案 1 :(得分:0)
当你说new myObject()
时会发生这种情况:
myObject
作为新对象的原型。myObject
函数,并将新对象绑定到函数范围内的this
。new
表达式求值为步骤1中创建的对象,除非myObject
函数调用返回了一个对象(就像你在这里一样)。通常在使用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;