這些不同的方法正確應用我更後端的傢伙比前端的傢伙,但JavaScript的令我着迷。我試圖將我的頭圍繞在我看來是多種不同的建模對象方法上。什麼是對象創建的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並發現How does JavaScript .prototype work?。第二個答案尤其是非常有啓發性,因爲我來自一個階級概念背景而不是原型概念背景。我還翻閱了一些幻燈片:http://ejohn.org/apps/learn/#65,這也很有幫助。事實證明,我所要做的就是創建TicketForm的一個實例,此時它的方法成爲提供給我:
var myForm = new TicketForm();
myForm.enable(form); // works as expected
我有三個問題:
- 爲什麼,除了個人編碼風格,會選擇上述方法之一嗎?
- 爲什麼我必須用第二種方法聲明對象的一個實例,而我沒有第一個方法呢?
- 這些編碼風格是否有適當的名稱?
http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752/ – smk
與您無關的實際問題,但只是說有時候,最好擴展jQuery而不是創建一個athor對象:http://jsfiddle.net/rMXRB/1/。執行'obj.method(選擇器)'你做'select.method()''。知道何時創建obj以及何時擴展對象是一件好事! –