/** * 组合继承模式最大的问题就是无论在什么情况下,都会调用两次超类的构造函数。 */ function SuperType(name) { this.name = name; this.colors=["red","blue","green"] }`` SuperType.prototype.sayName = function () { alert(this.name); } function SubType(name, age) { //第二次调用SuperType(),这一次又在新对象上创建了实例属性name和colors,于是这两个属性就屏蔽了原型中的两个同名属性。 SuperType.call(this, name); this.age = age; } //组合继承,第一次调用SuperType(); SubType.prototype会得到两个属性:name,colors //可使用寄生组合继承 inheritPrototype(SubType,SuperType)替换此处的代码, //此种方式高效率体现在只调用一次SuperType的构造函数,并且避免在SubType.prototype上面创建不必要的、多余的属性,于此同时原型链保持不变 //开发人员普遍认为寄生组合式继承是引用类型最理想的继承方式 SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; SubType.prototype.sayAge = function () { alert(this.age); } function object(o) { function F() { }; F.prototype = o; return new F(); } //实现寄生组合式继承 function inheritPrototype(subtype, supertype) {//参数为子类型构造函数和超类型构造函数 //创建超类型原型的一个副本 var prototype = object(supertype.prototype); //为创建的副本添加constructor属性,弥补重写原型失去的constructor属性 prototype.constructor = subtype; //将新创建的对象副本赋值给子类型的原型 subtype.prototype = prototype; }
JS高级程序设计学习笔记-寄生式组合继承
最新推荐文章于 2021-05-22 19:49:03 发布