中间ctor对象在__extends中做了什么

时间:2014-06-17 00:27:51

标签: javascript coffeescript typescript

TypeScript和CoffeeScript都使用__extends函数来设置继承。这是TypeScript的一种形式(CoffeeScript' s非常相似)。

var __extends = 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 __()(CoffeeScript中为function ctor())?为什么不直接设置原型:

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];

    d.prototype = new b();
};

2 个答案:

答案 0 :(得分:1)

这三行a):

    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();

几乎完全等同于b):

    d.prototype.__proto__ = b.prototype;

而a)之所以被强制是因为__proto__是非标准的。

我说几乎完全因为在。)构造函数是可枚举的,而在b。中它没有被修改,因此保持原样(不可枚举)。更好的实现将使用Object.create,但在ES3(仍然是TypeScript的编译目标)中不可用。

答案 1 :(得分:0)

John Resig可能已经在Simple Javascript Inheritance中回答了这个问题。

  

对此有什么挑战,我们真正想要的只是'instanceof'的好处,而不是实例化Person对象和运行其构造函数的全部成本。

通过创建中间ctor__对象,__extends方法不必调用基类构造函数来设置原型!