2017-01-18 3 views
1

Мой вопрос вдохновлен this questionпонимания машинописи наследование

Это код машинописи наследования

var __extends = (this && this.__extends) || function (d, b) { 
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; 
    function __() { this.constructor = d; } 
    __.prototype = b.prototype; 
    d.prototype = new __(); 
}; 

и я упрощенная версию этой версии

function extend(Destination, Base) { 
    function Hook() { this.constructor = Destination; } 
    Hook.prototype = Base.prototype; 
    var hook = new Hook(); 
    Destination.prototype = hook; 
}; 

и рисую графическое ПРЕДСТАВЛЕНИЕ вдохновлено here :

enter image description here

Не могли бы вы подтвердить или исправить гафическое представление?
я особо не понимаю эту часть:

function Hook() { this.constructor = Destination; } 

И могли бы вы рассказать мне, как наследование работы с аргументами и сопровождал пример

ответ

1

Это это любая помощь, я прокомментировал каждую строку, чтобы проиллюстрировать то, что он делает , на основе текущей __extends функции (она немного изменилась из вашего примера)

var extend = function (subType, superType) { 

    // Copy superType's own (static) properties to subType 
    for (var property in superType) { 
     if (superType.hasOwnProperty(property)) { 
      subType[p] = superType[p]; 
     } 
    } 

    // Create a constructor function and point its constructor at the subType so that when a new ctor() is created, it actually creates a new subType. 
    function ctor() { 
     this.constructor = subType; 
    } 

    if(superType === null) { 

     // Set the subType's prototype to a blank object. 
     subType.prototype = Object.create(superType); 

    } else { 

     // set the ctor's prototype to the superType's prototype (prototype chaining) 
     ctor.prototype = superType.prototype; 

     // set the subType's prototype to a new instance of ctor (which has a prototype of the superType, and whos constructor will return a new instance of the subType) 
     subType.prototype = new ctor(); 
    } 
}; 

Обратите внимание, что __extends может снова измениться в самое ближайшее время включают в себя использование Object.setPrototypeOf(...);

GitHub - Change Class Inheritance Code

+0

Благодарим за ответ. Вы сказали: «Назовите его конструктор в subType, чтобы при создании нового ctor() он фактически создал новый subType.'. Это мне непонятно. –

+0

, например, из хром-консоли: объявляю subType'function subType() {this.a; alert (this.a);} 'и ctor' function ctor() {this.constructor = subType} ', но когда я делаю' new ctor() ', он не выдает предупреждения –

+0

@asdf_enel_hak Вам также необходимо связать прототипы. одного конструктора недостаточно – series0ne

0

Когда я СИНТАЗЫ мой вопрос и this answer и ответ

Здесь @ series0ne является то, что я понял из машинопись наследования:

функция CTOR() делает:

Как и в связанном ответе:

Car.prototype.constructor = Car; 

это equivelant

subType.prototype.constructor = subType 

который обеспечивает:

subType.constructor === subType -> true 

для

ctor.prototype = superType.prototype; 
subType.prototype = new ctor(); 

это эквивалентно

Car.prototype = new Vehicle(true, true); 

который обеспечивает

subType.prototype = new superType(); 
Смежные вопросы