2010-04-21 19 views
10

Mam pewne problemy ze zrozumieniem klauzuli jeśli na koniec tej funkcji z Pro Design Patterns JavaScript przedłużyć:JavaScript dziedziczenie funkcji

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

Książka wyjaśnia, że ​​linie te zapewniają, że atrybut konstruktor nadklasy jest prawidłowo set, nawet jeśli superklasą jest sama klasa Object. Jednak, jeśli pominąć te trzy linie i wykonaj następujące czynności:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

Alert mówi „prawdziwy”, co oznacza, konstruktor nadklasy jest ustawione prawidłowo, nawet bez tych ostatnich trzech liniach. W jakich warunkach to stwierdzenie JAŚ czyni coś pożytecznego?

Dzięki.

+0

Mam pytanie: dlaczego funkcja pośrednicząca F, zamiast po prostu subClass.prototype = new nadklasy() ;? – 755

Odpowiedz

14

Problem, że te dwie linie starają się unikać, jest na ogół produkowane przy wymianie właściwość funkcji konstruktora prototype, na przykład:

function Foo() {}; 
Foo.prototype = { 
    bar: 'baz' 
}; 

var foo = new Foo(); 
foo.constructor === Object; // true, but `constructor` should refer to Foo 

Kiedy functions objects are created właściwość prototype jest inicjowany z nowego obiektu , który zawiera właściwość constructor który odnosi się do samej funkcji, np

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

po wymianie nieruchomość prototype inny obiekt, ten obiekt ma własną właściwość constructor, zazwyczaj dziedziczoną z innego konstruktora lub od Object.prototype.

var newObj = {}; 
newObj.constructor === Object; 

Polecane artykuły:

+1

To oczyszcza to dla mnie. Dzięki. Wyjaśnienie autorów tego kodu jest mylące. Powinni byli powiedzieć, że zapewnia to, że nadklasa nie została niewłaściwie przedłużona. – Zach

Powiązane problemy