backbone的对象继承实现
通过原型链实现对象的继承,子类通过’__super__‘来访问父类的方法
1 // protoProps 子类的属性参数 2 // staticProps 静态属性 3 var extend = function(protoProps, staticProps) { 4 var parent = this; 5 var child; 6 7 // 如果protoProps参数中存在构造函数则使用,否则使用父类的构造函数 8 if (protoProps && _.has(protoProps, 'constructor')) { 9 child = protoProps.constructor; 10 } else { 11 child = function(){ return parent.apply(this, arguments); }; 12 } 13 14 // 合并静态属性到子类 15 _.extend(child, parent, staticProps); 16 17 // 声明一个代理类,构造函数指向子类,不需要调用父类的构造函数 18 var Surrogate = function(){ this.constructor = child; }; 19 // 代理类的原型链继承父类的原型链 20 Surrogate.prototype = parent.prototype; 21 // 实例化代理类,并赋值给子类的原型属性,实现父类原型链继承 22 child.prototype = new Surrogate; 23 24 // 如果有传人protoProps参数,则把传人protoProps参数合并到实例化后的子类原型属性上 25 // 实现子类重写父类属性或方法 26 if (protoProps) _.extend(child.prototype, protoProps); 27 28 // 把父类的原型属性赋值给子类的’__super__‘属性, 29 // 子类可以通过’__super__‘属性来访问父类的原型链中的方法 30 child.__super__ = parent.prototype; 31 32 return child; 33 };