所以,这不是一个“新”问题,但除了创建一些全局之外,我似乎找不到解决方案。但如果我有超过 1 个实例,该全局将与其他插件实例发生冲突。例如。
;(function( $, window, document, undefined ) {
var self = {};
function Niftyplugin(elem, config){
this.config = $.extend( {}, $.fn.niftyplugin.config, config );
this.elem = elem;
this.$elem = $( elem );
self.config = this.config;
}
}
我可以避免不断需要做这样的事情:
var that = this;
在会产生范围问题的函数中,但如您所见 - 我正在使用全局
var self = {};
或我可以使用的任何其他名称。
我的问题是,有没有更好的方法?一种更强大的方式,我的插件可以在构造函数中将不会与其他实例冲突的“this”obj分配给某个 var/obj ?
我试过...
;(function( $, window, document, undefined ) {
var self = {};
function Niftyplugin(elem, config, _self){ // <-- passing in _self
this.config = $.extend( {}, $.fn.niftyplugin.config, config );
this.elem = elem;
this.$elem = $( elem );
_self.config = this.config; // <-- _self
}
}
Niftyplugin.prototype = {
// all the methods, and subsequently in some methods I'd have to use
// var that = this. In situations of scope. I want to not do this and
// make my plugin self-contained with no global vars. But I want to circumvent
// need to assign "this" to vars etc..
}
$.fn.niftyplugin = function( config ) {
if(this.length){
this.each(function() {
var nifty = new Niftyplugin( this, config, {} ); // <-- passing in obj
}
}
}
我希望我很清楚。
编辑: 为了更清楚。
可以说,在我的方法实例中......我有类似的东西:
Niftyplugin.prototype = {
_create : function(){
$(someobj).each(function(){
self.someVar <------ this gives me an error. "self" is undefined.
})
}
}
这是我的问题。即使我在构造函数中声明了“var self”,它也不会继承到原型方法中。这让我感到困惑。现在,如果我将“var self”声明为全局变量,然后在构造函数中将其分配给它,就可以了。但是,我不想弄乱全局空间(即使它位于匿名函数中)。
现在,如果我做类似的事情
Niftyplugin.prototype = {
_create : function(){
var self = this;
$(someobj).each(function(){
self.someVar <------ this works
})
}
}
但我想规避总是必须在每个原型方法中做一个 var self = this 。因此,我需要一个可以在构造函数中声明或传入等的“this”等价变量……我可以使用它。如果我有使用插件的各种元素,则该 var 不会发生冲突。