2013-06-19 9 views
5

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:

  1. Dlaczego, oprócz osobistego kodowania styl, czy wybrać jedną z powyższych metod zamiast drugiej?
  2. Dlaczego muszę zadeklarować instancję obiektu drugą metodą, a nie pierwszą?
  3. Czy są odpowiednie nazwy obu tych stylów kodowania?
+0

http://www.amazon.com/JavaScript-Patterns-Stoyan-Stefanov/dp/0596806752/ – smk

+1

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! –

Odpowiedz

2

W obiektach JavaScript domyślnie są one zmienne. Oznacza to, że jeśli nie używasz nowoczesnego silnika JavaScript i ktoś celowo uniemożliwiał modyfikowanie obiektu, zawsze możesz dodawać, usuwać i modyfikować właściwości w obiekcie.

W pierwszym przypadku używasz specjalnej składni, która upraszcza tworzenie obiektów. Składnia {} tworzy prosty obiekt, który jest nie więcej niż instancją Object. To, w połączeniu z zmienności obiektów w JS oznaczają następujące fragmenty są równoważne:

var TicketForm = { 
    elements: ['input', 'textarea', 'select', 'checkbox'] 
}; 

var TicketForm = {}; 
TicketForm.elements = ['input', 'textarea', 'select', 'checkbox']; 

var TicketForm = new Object(); 
TicketForm.elements = ['input', 'textarea', 'select', 'checkbox']; 

Zasadniczo pomocą {} jest podobna do tworzenia wystąpienie obiektu w klasycznym języku OOP podczas tworzenia konstruktor jest podobne do używania klasy.W funkcji konstruktora i jego prototypie definiujesz plan, który przyjmie wszystkie instancje tej funkcji konstruktora (wszystkie obiekty, które dzielą ten prototyp).

Nie chodzi więc o styl, ale o to, co trzeba stworzyć. Jeśli potrzebujesz wielu kopii tej samej rzeczy, użyjesz funkcji konstruktora. Jeśli potrzebujesz tylko jednego, po prostu utwórz zwykły obiekt, nie musisz przestrzegać etykiety, zrób singleton i podpisuj wszystko potrójnie;)

3

Twoja pierwsza metoda definiuje obiekt dosłownie, tworząc po prostu "singleton". Jeśli potrzebujesz wielu wystąpień tej samej "klasy", potrzebujesz funkcji konstruktora (lub Object.create).

+0

Wierzę, że to odpowiada na wszystkie Twoje 3 pytania, proszę dać mi znać, jeśli nie. – bfavaretto

+0

Być może ta inna odpowiedź, którą właśnie napisałem, może być pomocna: http://stackoverflow.com/questions/17200558/javascript-functions-and-objects-using-keyword-this-does-notworkwork – bfavaretto

+0

Strona MDN dla [ 'Object.create'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create). –

0

Pierwsza metoda to "obiekt miotowy", zupełnie jak klasa statyczna, " ten "odnosi się do obiektu nadrzędnego" TicketForm ", możesz go zrozumieć jak" self ". W drugiej metodzie „to” odnosi się do okna, to nie oo, chyba że zrobić:

var myForm = new TicketForm(); 

tutaj „to” odnosi się do instancji MyForm. Ta metoda jest metodą "konstruktora" (TicketForm jest konstruktorem)

Powiązane problemy