2013-02-20 9 views
5

Jestem świadomy ogólnych zasad programowania obiektowego jak enkapsulacja, dziedziczenie, polimorfizm, abstrakcja, etcobiektowe JavaScript z przykładu

Ale czy teraz chcą zrozumieć te pojęcia z perspektywy JavaScript. Ktoś może wziąć bardzo prosty przykład i uruchomić, jak to działa w kontekście JS (enkapsulacja, dziedziczenie, polimorfizm, abstrakcja)

Wiele czytałem na ten temat w Internecie, ale artykuły sprawiły, że byłem bardziej zdezorientowany.

Dziękuję.

+0

Dlaczego nie znajdziesz problemu, który Cię interesuje, i sprawdź, czy możesz go rozwiązać za pomocą tych technik, a następnie wrócić, jeśli masz konkretne problemy techniczne. Niektóre z tych pojęć nie są tak ważne lub są inaczej implementowane w JS w porównaniu do języków takich jak C++. – Aesthete

+0

Powinieneś przeglądać artykuły w wolniejszym tempie. Absorpcja rzeczy powoli zmniejsza zamieszanie. Powiedział, że głosuję, aby zamknąć to pytanie, ponieważ żądania tutoriala nie dotyczą tematu przepełnienia stosu. –

+0

Powinieneś przeczytać o różnicach między klasami i prototypami. Na przykład dobra odpowiedź mówi o klasycznym dziedziczeniu i prototypowym dziedziczeniu: http://stackoverflow.com/a/186279/1068746. Po prawidłowym otrzymaniu prototypów reszta to bułka z masłem. –

Odpowiedz

4

Można użyć funkcji do definiowania obiektu Singleton

var apple = new function() { 
    this.type = "macintosh"; 
    this.color = "red"; 
    this.getInfo = function() { 
     return this.color + ' ' + this.type + ' apple'; 
    }; 
} 

używać go jak podano poniżej

apple.color = "reddish"; 
alert(apple.getInfo()); 

new function(){...} robi dwie rzeczy jednocześnie: Zdefiniuj funkcję (anonimowy konstruktor) i wywołaj go z nowym.

+3

'apple' nie jest klasą (lub funkcją konstruktora, ponieważ nie ma żadnych technicznych klas w JS), jest instancją anonimowej funkcji konstruktora. –

+0

Jaki jest sens używania 'new' tutaj przed' funkcją'? – jfriend00

+0

@ jfriend00 Tworzy funkcję, zwracając '{type:" macintosh ", kolor:" czerwony ", getInfo: function() {...}}' –

5

Myślę, że najbardziej interesujące jest to, enkapsulacji jak wielu ludzi nie wykorzystać go prawidłowo.

Weźmy prosty obiekt jako przykład

var Person = function(firstName, lastName, isMr) { 
    var prefix = isMr ? "Mr." : "Mrs." ; 
    this.getFullName = function() { return prefix + " " 
             + firstName + " " + lastName } 

} 

var p = new Person ("guy","mograbi", true); 
p.getFullName(); // => "Mr. guy mograbi" 
// p.prefix ==> causes an error. 

Inheritance - jest po prostu rozszerzenie prototyp

var Superhero = function(){ 
      Person.call(this); 

    } 

Jednakże właściwe dziedziczenie jest problemem sama. Sprawdź https://stackoverflow.com/a/4985616/1068746

polimorfizm - jest dość proste, biorąc pod uwagę nowy prototyp, który implementuje „getFullName”

var Child = function(){ 
    this.getFullName = function(){ return "not allowed to talk with strangers" } 
} 

podane function(a){ a.getFullName() } Dostaniesz pełną nazwę, jeśli jest osoba i „nie wolno .. "jeśli a jest dzieckiem.

Abstrakcja - jest bardziej rzeczą bezpieczną dla języka. https://stackoverflow.com/a/4082496/1068746

+0

Thx za to ... Czy to będzie możliwe aby dodać więcej szczegółów do tego samego ... podobnie jak w przykładzie enkapsulacji, można powiedzieć, gdzie dokładnie dzieje się enkapsulacja? Również w przypadku, gdy możesz wyjaśnić Dziedziczenie/Polimorfizm bardziej szczegółowo za pomocą prostych przykładów? – testndtv

20

Opiszę wzór Douglasa Crockforda, aby naśladować styl używany w językach programowania obiektowego. Nie używa prototypowego dziedziczenia. W rezultacie jest nieco mniej efektywny, ponieważ każdy obiekt musi przechowywać odniesienie do każdej metody. Ale jest to bardzo przydatne do celów ilustracyjnych.

Encapsulation:

function MyClass (a, b) 
{ 
    this.publicProperty = 1; 
    var _privateProperty = 2; 
    function _privateMethod() { 
     // only private methods and privileged methods can call this 
    }; 
    this.publicMethod = function() { 
     // can access _privateProperty and call _privateMethod 
    }; 
} 
MyClass.classMethod = function() { 
    // not tied to any instances 
}; 

Wystarczy utworzyć obiekty z var instance = new MyClass(a, b);

dziedziczenia:

function DerivedClass(a, b, c) 
{ 
    // must explicitly call superclass constructor, like in Java 
    MyClass.apply(this, arguments); 

    this.anotherProperty = 3; 
    function _anotherPrivateMethod() { }; 

    this.publicMethod = function() { 
     // can access _privateProperty and call _privateMethod 
    }; 
} 
DerivedClass.classMethodMethod = function() 
{ 
    // not tied to any instances 
}; 

Polimorfizm w JavaScript jest najczęściej zastępuje wpisując kaczka (http://en.wikipedia.org/wiki/Duck_typing). Programiści zazwyczaj grupują metody/właściwości pod obiektami, a ty po prostu testujesz obecność tych obiektów. W ten sposób wykrywane są na przykład możliwości przeglądarki newfangles.

Abstrakcja jest ściśle związana z polimorfizmem - o ile coś obsługuje interfejs, zwykle nie dba o to, jak działa pod spodem. W ten sposób możesz pobrać bibliotekę JavaScript i po prostu użyć jej w oparciu o jej dokumentację.

Mam nadzieję, że to pomoże.

+1

+1: tego właśnie szukałem: prosty przykład opisujący prywatne/publiczne właściwości/metody i dziedziczenie dla OOJS. – sp00m

Powiązane problemy