通过原型链实现对象的继承,子类通过’__super__‘来访问父类的方法
// protoProps 子类的属性参数
// staticProps 静态属性
var extend = function(protoProps, staticProps) {
var parent = this;
var child; // 如果protoProps参数中存在构造函数则使用,否则使用父类的构造函数
if (protoProps && _.has(protoProps, 'constructor')) {
child = protoProps.constructor;
} else {
child = function(){ return parent.apply(this, arguments); };
} // 合并静态属性到子类
_.extend(child, parent, staticProps); // 声明一个代理类,构造函数指向子类,不需要调用父类的构造函数
var Surrogate = function(){ this.constructor = child; };
// 代理类的原型链继承父类的原型链
Surrogate.prototype = parent.prototype;
// 实例化代理类,并赋值给子类的原型属性,实现父类原型链继承
child.prototype = new Surrogate; // 如果有传人protoProps参数,则把传人protoProps参数合并到实例化后的子类原型属性上
// 实现子类重写父类属性或方法
if (protoProps) _.extend(child.prototype, protoProps); // 把父类的原型属性赋值给子类的’__super__‘属性,
// 子类可以通过’__super__‘属性来访问父类的原型链中的方法
child.__super__ = parent.prototype; return child;
};