javaScript设计模式之面向对象编程(object-oriented programming,OOP)--寄生组合式继承
组合式继承:将类式继承同构造函数继承组合使用,但是存在一个问题,子类不是父类的实例,而子类的原型式父类的实例,所以才有了寄生组合式继承。
意思就是说,寄生就是寄生式继承,寄生式继承就是依托于原型继承,原型继承又与类式继承差不多,所以另外一种继承模式应该是构造函数继承。当然子类不是父类的实例的问题是由于类式继承引起的。
说道这,我不得不说一下,道格拉斯大哥对寄生式继承的改造
function inheritPrototype(subClass,superClass){ //复制一份父类的原型副本保存在变量中 var p = inheritObject(superClass.prototype); //修正因为重写子类原型导致子类的construction属性被修改 p.constructor = subClass; //设置子类的原型 subClass.prototype = p; }
我们需要的是继承仅仅是父类的原型,不再需要调用父类的构造函数。
测试一下
//定义父类 function SuperClass(name){ this.name = name; this.colors = ['red','blue','green']; } //定义父类原型的方法 SuperClass.prototype.getName = function(){ console.log(this.name); } //定义子类 function SubClass(name,time){ //构造函数式继承 SuperClass.call(this.name); //子类新增属性 this.time = time; } //寄生式继承父类原型 inheritPrototype(SubClass,SuperClass); //子类新增原型方法 SubClass.prototype.getTime = function(time){ console.log(this.time); } //创建两个测试方法 var instance1 = new SubClass('js book',2014); var instance2 = new SubClass('css book',2013);
我们首先创建父类,以及父类的原型方法,
然后创建子类,并在构造函数中实现构造函数式继承,
然后又通过寄生式继承了父类原型,
最后又对子类添加一些原型方法。
instance1.colors.push('black'); console.log(instance1.colors); //['red','blue','green','black'] console.log(instance2.colors); //['red','blue','green'] instance1.getName(); //css book instance2.getTime(); //2013
注意:子类再想添加原型方法必须通过prototype对象,通过点语法的形式一个一个添加方法,否则会被直接赋予对象就会覆盖掉从父类原型继承的对象。
文中有错误的地方希望指出,共同进步
标签:
JavaScript设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述