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);

  

posted on   Kooing  阅读(188)  评论(0编辑  收藏  举报

编辑推荐:
· 深入理解 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 构建精确任务处理应用

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示