如何理解CoffeeScript的`extends`关键字生成的JavaScript代码

时间:2012-06-03 02:05:18

标签: javascript coffeescript prototypal-inheritance

这是CoffeeScript的extends关键字生成的JavaScript代码。原型链如何设置?

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; 
};

1 个答案:

答案 0 :(得分: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; 
};

请参阅http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html(我自己的博文)