我更喜欢后端而不是前端,但 JavaScript 让我很感兴趣。我试图围绕在我看来是多种不同的对象建模方法。
在过去的几年里,我主要是在编写看起来与此类似的代码(假设已加载 jQuery):
var TicketForm = {
elements: ['input', 'textarea', 'select', 'checkbox'],
enable: function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', false);
});
},
disable: function(form) {
this.element.forEach( function(el) {
form.find(el).prop('disabled', true);
});
}
};
这样我可以简单地调用TicketForm.enable($('#whatever'));
来启用特定的表单,非常类似于 PHP 中的静态方法调用。
我最近一直在使用 PHP 中的闭包,并且我知道它们在 JavaScript 中也存在(并且我正在使用它们)。我正在尝试更彻底地真正掌握这个概念。在遇到这个惊人的脚本后:http ://codepen.io/stuffit/pen/KrAwx ,我决定努力模仿该作者的编码风格。只是试图复制他的风格,我重写了我的代码,如下所示:
var TicketForm = function() {
this.elements = ['input', 'textarea', 'select', 'checkbox'];
};
TicketForm.prototype.enable = function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', false);
});
};
TicketForm.prototype.disable = function(form) {
this.elements.forEach( function(el) {
form.find(el).prop('disabled', true);
});
};
但是,当我TicketForm.enable($('#whatever'));
在这种情况下打电话时,我得到了错误
Uncaught TypeError: Object function () {
this.elements = ['input', 'textarea', 'select', 'checkbox'];
} has no method 'enable'
所以我对 SO 进行了一些挖掘,发现JavaScript .prototype 是如何工作的?. 特别是第二个答案非常有启发性,因为我来自类概念背景而不是原型概念背景。我还浏览了其中一些幻灯片:http ://ejohn.org/apps/learn/#65 ,这也很有帮助。事实证明,我所要做的就是创建一个 TicketForm 实例,此时它的方法对我可用:
var myForm = new TicketForm();
myForm.enable(form); // works as expected
我有三个问题:
- 为什么除了个人编码风格之外,有人会选择上述方法中的一种而不是另一种?
- 为什么我必须用第二种方法声明一个对象的实例,而我不用第一种?
- 这些编码风格中的任何一种都有专有名称吗?