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();
};
答案 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
方法不必调用基类构造函数来设置原型!