我在尝试构建一个简单的jQuery插件时遇到了一个问题,我想这与范围有关。
简单问题:类(A)创建一个对象(B),其中属性(C)被设置为类方法之一(D)。如何通过属性(C)访问对象(B)中未包含的A类方法?
更长的版本(下面的代码):我在插件中声明一个对象(让我们称之为publicMethods),由一堆方法组成。这些方法应该是一些默认方法(在插件中声明),或者用户声明的方法,如果用户在初始化插件时声明了自己的方法。
这个想法是,当用户定义自己的自定义方法时,该函数中应该有一些函数和变量可供她访问(如this.someVar)。
这会产生一些限制。
我希望默认方法可以访问一些内部函数和变量,而不包含在对象publicMethods中。但是当我通过它们所在的对象访问这些方法时,我没有直接调用它们,而是无法访问该对象内部的其他变量/函数。
我试图找到一种方法让默认方法可以访问它的类兄弟姐妹。我知道在调用方法之前我可以做一些条件语句(如果它是用户定义的),或者甚至声明一个指向"这个"的全局变量,但是我要保持它干净。
var Plugin = function (opt) {
this.settings = $.extend({
"someVar" : "Value",
"someFunc" : null
});
this.anotherVar = "Hello World";
this.setPublic();
this.run();
}
Plugin.prototype = {
setPublic: function() {
this.publicMethods.someFunc = this.someFunc;
if ($.isFunction(this.settings.someFunc)) {
this.publicMethods.someFunc = this.settings.someFunc;
} else {
this.publicMethods.someFunc = this.someFunc;
}
},
someFunc: function(arg) {
return this.anotherVar; // returns type error the second time
},
run: function () {
this.someFunc();
this.publicMethods.someFunc();
}
}
答案 0 :(得分:1)
来自MDN:Function.prototype.bind()
:
bind()
方法创建一个新函数,在调用时,将this
关键字设置为提供的值,[...]。
所以以下内容应该有效:
setPublic: function() {
this.publicMethods.someFunc = this.someFunc.bind(this);
if ($.isFunction(this.settings.someFunc)) {
this.publicMethods.someFunc = this.settings.someFunc.bind(this);
}
// This is redundant anyway:
/* else {
this.publicMethods.someFunc = this.someFunc.bind(this);
}*/
},