我正在从原型切换到 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”指向匿名嵌套对象本身...)