2012-03-21 12 views
6

Mam tło w OOP. Zacząłem dużo pracować z JavaScript. Wraz z rozwojem projektu coraz trudniej jest go utrzymać. W Javie stosuję zasady OOP, aby utrzymać wszystko pod kontrolą. Co powinienem zrobić z JavaScriptem, co powinienem zbadać, który ma na celu kontrolowanie aplikacji JavaScript?OOP vs JavaScript

+0

Spójrz na Backbone.js, a może Coffeescript. Działają bardzo dobrze razem. – asawyer

+13

JavaScript jest obiektowy. – Gumbo

+0

sprawdź [helephant] (http://helephant.com/2008/08/17/how-javascript-objects-work/) dla niektórych pomysłów OO. – jbabey

Odpowiedz

6

Możesz zastosować zasady OOP do rozwoju Javascript. JavaScript używa prototypowego dziedziczenia, ale jest to szczegół implementacji. Koncepcje są wciąż takie same. Większość pojęć, które znasz, ma bezpośrednie odpowiedniki w javascript.

Inne metody wypróbowane i prawdziwe zastosowanie także:

1) pozostają suche - Nie powtarzaj się. Duplikat kodu jest zawsze zły.
2) Oddzielne zgłoszenia - Użyj wzorców MVC lub MVVM, aby zachować czystość kodu i wykonywać tylko jedną rzecz.
3) Test - Kiedy słyszę "Trudne do utrzymania", mój mózg tłumaczy to na brak testów. Z pewnością możesz pisać testy jednostkowe dla projektów javascript.
4) Code Review - Opinie kod może być dobrym sposobem odrzucenia powielane kod, kod, który nie został wykonany prawidłowo, nie sformatowany, itd ....

+0

... cóż, wystarczająco blisko. Rozróżnienie jest jednak ważne, aby wiedzieć; na pewno warto się temu przyjrzeć. –

+0

Co masz na myśli "wystarczająco blisko"? Czy się nie zgadzasz? – hvgotcodes

+0

Prototyp nie jest synonimem podklasy; istnieją pewne różnice dotyczące sposobu, w jaki pola i funkcje są "adoptowane". Na przykład wiele obiektów współużytkujących prototyp dosłownie dzieli prototypowane pole, a zmiana go może zmienić właściwość dla wszystkich obiektów podrzędnych. –

-1

W JavaScript, funkcje są obiektami; Mozilla Developer Network,McKoss,SitePoint, i JavaScript Kit wyjaśnić dalej.

Przykład JavaScript obiektu

function myObj() { 
    this.myMethod = function() { 
    alert('hello'); 
    } 
} 
var demo_obj = new myObj(); 
demo_obj.myMethod(); 

wzorców utrzymać wszystko pod kontrolą

Anty-wzorców do niech rzeczy spod kontroli

  1. zanieczyszczanie przestrzeni nazw
  2. użycie eval()
  3. prototypowania przeciwko obiektu Object
  4. Inline Script Tagi.
  5. wykorzystanie document.write
+3

A jak to odpowiada na pytanie? – delnan

0

Kiedy byłem w takiej samej sytuacji, zacząłem patrzeć na „tak jak inne”. Skończyło się na http://dojotoolkit.org/ i http://jquery.com i szukałem sposobu, w jaki implementują widgety/wtyczki, aby inne mogły rozszerzyć framework.

2

W ten sposób definiujesz obiekty i metody w javascript.

function SomeObj() { 

    this.someMethod = function() { 
     alert('boo'); 
    } 
} 

var o_obj = new SomeObj(); 
o_obj.someMethod(); //alerts "boo" 

Mam nadzieję, że to pomaga.

Można również użyć prototypu do tworzenia funkcji statycznych.

this.prototype.someMethod = function() { 
    alert('boo'); 
} 
+0

Proszę użyć * pierwszej wielkiej litery * w 'someObj'. Jest to standardowa konwersja nazw w języku JavaScript. Pokazuje, że należy "nowe" stworzyć instancję obiektu. Porównaj na przykład z 'var now = new Date();'. – Oleg

+0

To prawda. Nazwy obiektów nawet zmieniły kolor na niebieski, teraz zaczynają się od wielkiej litery. – c0d3Junk13

+0

Polecam dodatkowo skorzystać z http://www.jslint.com/ w celu weryfikacji kodu. Ty . Zobaczysz "Nazwa konstruktora" someObj "powinna zaczynać się od wielkiej litery" w poprzednim kodzie. Dodatkowo zauważysz, że powinieneś dołączyć ";" po 'this.someMethod = function() {alert ('boo'); } 'ponieważ jest to instrukcja przypisania. – Oleg

0

Innym sposobem definiowania proste obiekty i metody w javascript (bez potrzeby new).

function creaeSomeObj() { 
    var that = {}; 
    that.someMethod = function() { 
     alert('boo'); 
    } 
    return that; 
} 

var o_obj = createSomeObj(); 
o_obj.someMethod(); //alerts "boo" 

Ten wzór nie obsługuje dziedziczenia, ale wiele razy jest wystarczający.

0

Dlaczego "kontra"? JavaScript obsługuje programowanie obiektowe, ale nie w tradycyjny sposób oparty na klasach, który można zobaczyć na przykład w Jawa.

Sposób działania OOP JavaScript działa zazwyczaj pod nazwą "prototypowe dziedziczenie", a dokładniej "delegatywne prototypowe dziedziczenie". Można to sprowadzić do "jeśli szukasz obiektu" foo "w obiekcie i nie możesz go tam znaleźć, a następnie spróbuj wyszukać 'foo' wewnątrz obiektu 'prototyp". To znaczy, że przeszukiwanie właściwości to delegowane do prototypu obiektu (mówimy, że obiekt dziedziczy po właściwościach prototypu).

Sposób działania prototypowego dziedziczenia ma kilka konsekwencji. Na przykład:

  • Obiekty w JavaScript są "dynamiczne" w tym sensie, że są tylko parą par nazwa-wartość. Nowe właściwości można dodawać i usuwać podczas wykonywania, więc są znacznie mniej "statyczne" niż obiekty w typowym dla klasy znaczeniu.
  • drodze delegative prototypal prace spadkowe („jeśli nie można znaleźć prototyp tutaj, a następnie szukać tutaj zamiast”) oznacza, że ​​jest o wiele prostszeniż klasycznego OOP. Z czysto prototypowego punktu widzenia nie potrzebujesz na przykład konstruktorów. "Metody" to zwykłe funkcje, które są dołączane do prototypu (co oznacza, że ​​są dostępne jako właściwości wszystkich dziedziczących obiektów).

Są wady i zalety z obu prototypal i klasycznego dziedziczenia, ale ważne jest, aby pamiętać, że są one inny.

Obecnie JavaScript jest pod pewnymi względami zainspirowany językami Java i innymi klasycznymi językami, dlatego postanowili utworzyć składnię "podobną do klasy", aby ułatwić osobom uczącym się na lekcjach rozpoczęcie nauki. Nie będę się nad tym dużo rozpisywał; zostało to już udokumentowane w innych miejscach.

Ciekawe posty:

0

Pluralsight ma kurs na ten temat: Structuring JavaScript Code, który może zapewnić pewien wgląd. Dwa zastrzeżenia: 1. Nie przeszedłem jeszcze kursu - ale zawartość wygląda świetnie i byłem pod wrażeniem innych kursów Pluralsight, które odbyłem, i 2. nie jest on darmowy (ale może być wart małych dolarów, jeśli oszczędza czas na drodze b/c masz lepszą strukturę kodu). Nie, nie pracuję dla Pluralsight.

Oprócz frameworka js wspomnianego w tym wątku, można również spojrzeć na Knockoutjs - świetne samouczki tutaj learnknockoutjs.com. Knockout koncentruje się na MVVM. Zauważ, że istnieje dobra dyskusja w stackoverflow comparing Backbone to Knockout, a Pluralsight ma również kurs na temat używania Knockout, który oglądałem i polecam.