2013-06-04 8 views
6

Profesjonalne JavaScript dla programistów WWW, wydanie trzecie Nicholas C. Zakas (Wrox, 2012, p.210-215 opisuje "kombinacja Parasitic Inheritance" za pomocą następujących funkcji:"pasożytnicze Kombinacja Inheritance" w profesjonalnych JavaScript dla programistów WWW

.
function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; 
    subType.prototype = prototype; 
} 

muszę jeszcze dowiedzieć się, co przypisanie podtypu do prototype.constructor robi lub ma robić Chyba jestem brakuje czegoś, wyjście zostanę przy użyciu kodu przykładu jest taki sam:

Bez "obiektu rozszerzenia" (prototype.constructor = subType;) w dziedziczeniuPrototype: http://jsfiddle.net/Q22DN/

Z "rozszerzyć przedmiot" (prototype.constructor = podtypu;) w inheritPrototype http://jsfiddle.net/eAYN8/

Może to być naprawdę linia kodu bezcelowego? Dziękuję za wyjaśnienie!

Odpowiedz

3

Przypisanie do "konstruktora" nie jest obowiązkowe, ponieważ przypisanie do "prototypu" jest. Powodem tego jest to, że prototypy funkcji zwykle pochodzą z ustawioną domyślnie właściwością "constructor". Może być użyteczne dla bibliotek, które kopiują obiekty, ponieważ można uzyskać odwołanie do konstruktora tego obiektu z samego obiektu.

function Foo(){ 
} 

obj = new Foo(); 

console.log(obj.constructor); //function Foo 
+0

jest jakiś powód do preferujesz ten wzór do goog.inherits? http://docs.closure-library.googlecode.com/git/closure_goog_base.js.source.html#line1466 Podoba mi się, jak ustawia on 'superClass_' w potomku, aby można było nadpisać metody nadrzędne i nadal wywoływać je z potomka. – HMR

+0

@HMR: Różne wzorce dziedziczenia mają tendencję do lepszej pracy z różnymi funkcjami (w jaki sposób wchodzisz w interakcję z "normalnymi" klasami, jeśli potrafisz obsługiwać wiele dziedziczenia, prywatne lub chronione zmienne, super itd.). Osobiście staram się programować w bardziej "funkcjonalnym" stylu, więc nie używam tak wielu klas, a kiedy ich używam, hierarchia jest zwykle bardzo płaska, więc nadklasy i rzeczy dziedziczenia nie kończą się zbytnio. – hugomg

+0

Zarówno missingno, jak i Givi są poprawne, ponieważ przypisanie do konstruktora nie jest obowiązkowe, a bez niego konstruktor instancji subType (lub child) === SuperType i zresetowanie go do SubType sprawi, że te informacje będą dostępne później. Być może to wszystko. Dzięki! –

2

Demo nadpisać prototyp konstruktora tak tracisz SubType.prototype.constructor a jeśli chcesz wiedzieć później konstruktora obiektu powinieneś jawnie ustawić go ...

function object(o){ 
    function F(){} 
    F.prototype = o; 
    return new F(); 
} 

function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; //if omit (new SubType()).constructor === superType 
    subType.prototype = prototype; 
} 

function SuperType(name){ 
    this.name = name; 
} 

function SubType(name, age){ 
    SuperType.call(this, name); 
    this.age = age; 
} 

inheritPrototype(subType, superType); 
+0

Skąd się bierze obiekt utworzony za pomocą 'new F();', który zmienia alias pustego wystąpienia 'SuperType'? Nadal będzie przydzielany w kupie, prawda? Dlatego gdy dostęp do właściwości nazwy 'var sub = new SubType (" Name ", 16); console.log (nazwa podrzędna) 'wykonywane jest wyszukiwanie prototypowe i łańcuch prototypów jest wsparty, a instancja F jest również w łańcuchu? Jeśli wpisuję 'sub .__ proto__', jednak otrzymuję' SubType {} ', a nie' F {} 'jako prototyp ... Gdzie poszło F? – tonix