したがって、これは「新しい」問題ではありませんが、グローバルを作成する以外に解決策が見つからないようです。しかし、複数のインスタンスがある場合、そのグローバルは他のプラグイン インスタンスと衝突します。例えば。
;(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が必要です。そして、プラグインを使用するさまざまな要素がある場合、その変数は衝突しません。