2012-06-03 4 views
5

To jest kod JavaScript wygenerowany przez słowo kluczowe CoffeeScript's extends. Jak konfiguruje się łańcuch prototypów?Jak rozumieć kod JavaScript wygenerowany przez słowo kluczowe "extends" firmy CoffeeScript

var __hasProp = Object.prototype.hasOwnProperty, 
__extends = function(child, parent) { 
    for (var key in parent) { 
     if (__hasProp.call(parent, key)) child[key] = parent[key]; 
    } 
    function ctor() { this.constructor = child; } 
    ctor.prototype = parent.prototype; 
    child.prototype = new ctor; 
    child.__super__ = parent.prototype; 
    return child; 
}; 
+0

Która część daje Ci kłopoty? –

+0

nie rozumiem tej linii: 'ctor.prototype = parent.prototype; ' – powerboy

+0

Mój wpis na blogu zawiera szczegółowe informacje. 'ctor' nazywa się * zastępczym konstruktorem *. Jest to oddzielny konstruktor, do którego kopiujesz prototyp rodzica. Tworzy prototypowy łańcuch 'child.prototype = new ctor' bez konieczności wywoływania konstruktora nadrzędnego tylko po to, aby skonfigurować dziedziczenie. Bardziej znanym (ale problematycznym) sposobem ustawiania dziedziczenia jest wykonanie 'child.prototype = new parent'. Znowu mój wpis na blogu zawiera szczegółowe informacje na temat problemów związanych z tym –

Odpowiedz

7
var __hasProp = Object.prototype.hasOwnProperty, 
__extends = function(child, parent) { 
    // Copy "static" attributes from the parent constructor to the child constructor 
    for (var key in parent) { 
     if (__hasProp.call(parent, key)) child[key] = parent[key]; 
    } 
    // This is the surrogate constructor, used so you don't need 
    // to instantiate an instance of the parent just to setup the prototype chain 
    // the statement in the surrogate constructor properly attaches 
    // the constructor property to object 
    function ctor() { this.constructor = child; } 
    // Attach the parent's prototype to the surrogate constructor 
    ctor.prototype = parent.prototype; 
    // This is setting up the chain, attaching an instance of a constructor whose 
    // prototype is set to the parent to the prototype property of the child 
    // In naive implementations, this would be child.prototype = new parent(); 
    child.prototype = new ctor; 
    // Allows access to the parent from user code, and used by the `super` keyword 
    child.__super__ = parent.prototype; 
    return child; 
}; 

Zobacz http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html (moim blogu)

+0

Wiem, że nie była to część, którą interesował się OP, ale czy wiesz, dlaczego ten kod używa '__hasProp'? Nie rozumiem, jak to pomaga w porównaniu do wypowiedzenia 'if (parent.hasOwnProperty (key))' ... – nnnnnn

+3

To jest tak, że nadal działa, nawet jeśli własność 'parent.hasOwnProperty' została nadpisana na rodzica. Czasami napisany jako '{} .hasOwnProperty.call (rodzic, klucz)' –

+0

OK, fajnie. Dzięki. – nnnnnn