プロトタイプからjqueryに切り替えていますが、「最良の」オブジェクト/クラス表記に苦労しています。私が最も気になるのは「this」コンテキストです。これにより、コールバック関数(イベントハンドラーやjqueryの.each()メソッドなど)で使用すると、オブジェクト自体にアクセスできなくなります。プロトタイプでは.bind()または.bindAsEventListener()を使用しますが、jqueryでは次のアプローチしか見つかりませんでした:1)オブジェクトポインターをキャッシュします(リテラル表記ではうまく機能しません)2)$ .proxy()を使用します方法私は両方の方法が非常にエレガントで醜いと思います。同じ機能のバリエーションが2つあります(シンプルなポップアップウィンドウ)。どちらが好きか、そしてその理由を教えてください。または、いくつかの改善を提案することもできます。よろしくお願いします。
バリアント1:
Dialog = function(container, callback) {
this.init(container, callback);
}
$.extend(Dialog.prototype, {
init: function(container, callback) {
this.dialog = $(container);
this.callback = callback;
this.buttons = {
ok: this.dialog.find('[data-type="ok"]'),
cancel: this.dialog.find('[data-type="cancel"]')
}
$.each(this.buttons, $.proxy(function(key, button) {
button.click($.proxy(function() { this.hide(key); }, this));
}, this));
},
show: function() {
this.dialog.show();
},
hide: function(key) {
this.dialog.hide();
this.callback(key);
}
});
バリアント2:
function Dialog2(container, callback) {
var self = this;
self.dialog = $(container);
self.callback = callback;
self.buttons = {
ok: self.dialog.find('[data-type="ok"]'),
cancel: self.dialog.find('[data-type="cancel"]')
}
$.each(self.buttons, function(key, button) {
button.click(function() { self.hide(key); });
});
self.show = function() {
self.dialog.show();
}
self.hide = function(key) {
self.dialog.hide();
self.callback(key);
}
}
インスタンスは、たとえば次を使用して作成されます。
var dialog = new Dialog($('#dialog'), function(result){ alert(result); });
dialog.show();
(また、よくわかりません。バリアント1で、「this.dialog」がブロック「this.buttons = {...}」内に定義されている理由です。ネストされたオブジェクト内の「this」は、匿名のネストされたオブジェクト自体...)