js继承
最基础的原型链
function superType () { this.property=true; } superType.prototype.getSuperProperty=function () { return this.property; } function subType () { this.subproperty=false; } subType.prototype=new superType(); subType.prototype.getSubProperty=function () { return this.subproperty; } var a=new subType(); console.log(a.getSuperProperty(),a.getSubProperty());//true,false
原型和实例的关系
a instanceof object
a instanceof subType
a instanceof superType//都是true
借用构造函数
在继承中,也有遗留的实例和原型函数中的引用问题
如果超类的原型函数中有引用,子类的修改将受到波及
我们现在可以使用一种组合的方法,在子类中定义一个超类,superType.call(this)
function superType () { this.color=["huanggabin","sb"]; } function subType () { superType.call(this); } superType.prototype=new superType(); var a=new subType(); a.color.push("fuck"); console.log(a.color); var b=new subType(); console.log(b.color);
如果超类有参数
function superType (name,age) { this.name=name; this.age=age; } function subType () { superType.call(this,name,age); }
组合继承
组合上面的两种方法:原型链和借用构造函数
可以有自己的引用同时拥有原型链
function superType (name) { this.name=name; this.color=["red","yellow"]; } function subType (name,age) { superType.call(this,name); this.age=age; } superType.prototype.sayName=function () { console.log(this.name); } subType.prototype=new superType(); subType.prototype.sayAge=function () { console.log(this.age); } var a=new subType("huanggabin",20); a.color.push("red"); console.log(a.color); a.sayAge(); a.sayName(); var b=new subType("huangsb",20); console.log(b.color); b.sayAge(); b.sayName(); </script>
原型式继承
function object (o) { function f () { } f.prototype=o; return new f(); }
o作为一个和新对象相似的对象,和原型链有相似,是以一个对象的实例作为超类,引用类型在里面会公用
上面函数可以用Object.create(o)代替
function Person () { this.name="huanggabin"; this.color=["red","yellow"]; } var a=new Person(); var b=Object.create(a); b.name="sb"; b.color.push("dddd"); console.log(a,b);
寄生式继承=原型式继承+工厂模式+寄生构造函数(和工厂差不多那个加强特有的array那种
function Person (name) { this.name=name; } function createBPerson (b) { var a=Object.create(b); a.sayName=function () { console.log(this.name); }; return a; } var a=new Person("huanggabin"); var b=createBPerson(a); b.sayName();
和原型式继承查不到,就是封装好了的工厂模式
寄生组合式继承
在组合继承很好的情况下,仍然有两次调用超类的构造函数和有一些无用数据,
我们加油了寄生式继承
function createSub (SubType,SuperType) { var a=Object.create(SuperType.prototype); a.constructor=SubType; SubType.prototype=a; }
上面的寄生式继承,帮我们完成了对象的链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function SuperType (name) { this .name=name; this .color=[ "red" , "yellow" ]; } function SubType (name,age) { SuperType.call( this ,name); this .age=age; } SuperType.prototype.sayName= function () { console.log( this .name); } SubType.prototype.sayAge= function () { console.log( this .age); } createSub(SubType,SuperType); //不用SubType.prototype=new SuperType(); var a= new SubType( "huanggabin" ,20); console.log(a); |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用