TypeScript 和 CoffeeScript 都使用 __extends
函数来设置继承。这是 TypeScript 的一种形式(CoffeeScript 非常相似)。
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()
)?为什么不直接设置原型(prototype):
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
d.prototype = new b();
};
最佳答案
这三行a):
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
几乎完全等同于b):
d.prototype.__proto__ = b.prototype;
之所以优先选择a)是因为__proto__
是非标准的。
我说几乎完全,因为在a.) 构造函数是可枚举的,而在b.) 中它没有被修改,因此保持原样(不可枚举)。更好的实现是使用 Object.create
,但这在 ES3 中不可用(它仍然是 TypeScript 的编译目标)。
关于javascript - 中间ctor对象在__extends中做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24254089/