Jestem bardziej facetem z back-endu niż facet z przodu, ale JavaScript intryguje mnie. Próbuję objąć moją głowę czymś, co wydaje mi się być różnymi metodami modelowania obiektów.Jakie są odpowiednie zastosowania tych różnych metod tworzenia obiektów w JavaScript
W ciągu ostatnich kilku lat byłem głównie został kod, który wygląda podobnie do tego na piśmie (zakładamy jQuery jest załadowany):
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);
});
}
};
ten sposób można po prostu zadzwonić TicketForm.enable($('#whatever'));
włączyć żadnej szczególnej formy, bardzo podobne do wywołania metody statycznej w PHP.
Ostatnio grałem z zamknięciami w PHP i jestem świadomy, że one istnieją (i używam ich) również w JavaScript. Staram się głębiej zrozumieć tę koncepcję. Po obejrzeniu tego niesamowitego skryptu: http://codepen.io/stuffit/pen/KrAwx, zdecydowałem, że chcę się starać naśladować styl kodowania tego autora. Tylko próbuje kopiować jego styl, przepisałem mój kod tak:
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);
});
};
Jednak, kiedy zadzwonić TicketForm.enable($('#whatever'));
w tym przypadku pojawia się błąd
Uncaught TypeError: Object function() {
this.elements = ['input', 'textarea', 'select', 'checkbox'];
} has no method 'enable'
więc zrobiłem trochę kopanie na SO i znaleziono How does JavaScript .prototype work?. Druga odpowiedź jest szczególnie pouczająca, ponieważ pochodzę z tła koncepcji klasowej, a nie z koncepcji prototypowej. Przeanalizowałem także kilka z tych slajdów: http://ejohn.org/apps/learn/#65, co również było pomocne. Okazuje się, że wszystko, co musiałem zrobić, to utworzyć instancję TicketForm, w których razem jest to metody stały się dostępne do mnie:
var myForm = new TicketForm();
myForm.enable(form); // works as expected
Mam trzy pytania:
- Dlaczego, oprócz osobistego kodowania styl, czy wybrać jedną z powyższych metod zamiast drugiej?
- Dlaczego muszę zadeklarować instancję obiektu drugą metodą, a nie pierwszą?
- Czy są odpowiednie nazwy obu tych stylów kodowania?
http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752/ – smk
Nic z tobą wspólnego z faktycznym pytaniem, ale po prostu mówiąc, czasami lepiej jest rozwinąć jQuery zamiast tworzyć obiekt athor: http://jsfiddle.net/rMXRB/1/. Instada robienia 'obj.method (selektor)' robisz 'select.method()'. Dobrze jest wiedzieć, kiedy stworzyć obiekt i kiedy rozszerzyć obiekt! –