企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 寄生式组合继承 - 解决“组合继承“调用两次构造函数的问题 解决的问题: * “组合继承“调用两次构造函数 * 引用数据共享 * 函数无法重用 ``` function SuperType(name) { this.name = name this.color = ['red', 'yellow', 'green'] } // 继承方法:把方法放在原型上,这样做个子类就可以重用次方法了 SuperType.prototype.sayName = function() { console.log(this.name) } function SubType () { // 继承属性 SuperType.call(this, 'tom') } // 原组合继承的实现 // 继承方法:把方法放在原型上,这样做个子类就可以重用次方法了 // SubType.prototype = new SuperType() // 现在寄生式组合的实现 inheritPrototype(SubType, SuperType) let instance1 = new SubType() // 执行父类的构造函数,这样每个子类都有自己的属性 color instance1.color.push('pink') console.log(instance1.color) // ['red', 'yellow', 'green', 'pink'] console.log(instance1.name) // tom console.log(instance1.sayName()) // tom let instance2 = new subType('jerry') console.log(instance2.color) // ['red', 'yellow', 'green'] console.log(instance2.sayName()) // jerry ``` ``` // 寄生式组合继承的思想 function inheritPrototype(SubType, SuperType) { let prototype = Object(SuperType.prototype) // 创建对象,创建父类原型的副本 prototype.constructor = SubType // 增强对象,解决由于重写原型导致 constructor 丢失的问题 SubType.prototype = prototype // 赋值对象,将创建的新对象复制给子类的原型 } ``` ## 重写原型导致 constructor 丢失 * 构造函数的 constructor 属性是构造函数声明时的默认属性 * 当改变构造函数的prototype 属性时,不会自动获得 constructor