❤ JS实现继承

128 阅读2分钟

❤ JS实现继承

JS实现继承的方式

1.原型链继承

2.借用构造函数继承

3.组合继承(经典继承)

4.原型式继承 方法一: 方法二:Object.create()

5.寄生式继承

6.寄生组合式继承

7.ES6、Class实现继承

继承的目的:

达到对象的属性和方法的复用

1、原型链继承

让一个构造函数的原型是另一个类型的实例,那么这个构造函数new出来的实例就具有该实例的属性。

当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾
// js继承-原型链继承
    console.log('js继承-原型链继承');
    console.log(this);
    // 父类 
    function Parent() {
       this.isShow = true
       this.info = {
           name: "mjy",
           age: 18,
       };
    }
    Parent.prototype.getInfo = function() {
       console.log(this.info,'this.info');
       console.log(this.isShow,'this.isShow');
    }
    //子类1
    function Child() {};
    Child.prototype = new Parent();

    let Child1 = new Child();
    console.log(Child1,'Child1');
    Child1.info.gender = "男";
    Child1.getInfo(); // {name: 'mjy', age: 18, gender: '男'} ture
    
    //子类2
    let child2 = new Child();
    child2.isShow = false
    console.log(child2,'child2');
    console.log(child2.info.gender,'child2.info.gender') // 男
    child2.getInfo(); // {name: 'mjy', age: 18, gender: '男'} false

分析结果:

image.png

优点:写法方便简洁,容易理解。

缺点:对象实例共享所有继承的属性和方法。传教子类型实例的时候,不能传递参数,因为这个对象是一次性创建的(没办法定制化)

2、借用构造函数继承

<script>
    // js继承-原型链继承
    console.log('js继承-02构造函数继承');

    function Parent(gender) {
        this.info = {
            name: "yhd",
            age: 19,
            gender: gender
        }
    }

    function Child(gender) {
        Parent.call(this, gender)
    }

    let child1 = new Child('男');
    child1.info.nickname = 'xiaoma'
    console.log(child1.info);

    let child2 = new Child('女');
    console.log(child2.info);
    </script>

———————————————

在子类型构造函数的内部调用父类型构造函数;使用 apply() 或 call() 方法将父对象的构造函数绑定在子对象上。

优点:解决了原型链实现继承的不能传参的问题和父类的原型共享的问题。

缺点:借用构造函数的缺点是方法都在构造函数中定义,因此无法实现函数复用。在父类型的原型中定义的方法,对子类型而言也是不可见的,结果所有类型都只能使用构造函数模式。 ————————————————

....持续更新中