js继承的几种方式

什么是继承?

继承:子承父业;一个原本没有某些方法或属性的对象,统一方法,拿到了另外一个对象的属性和方法。
1.构造函数继承(改变this指向继承)
 function Parent(n){
        this.name = n;
        this.skill = function(){
            console.log(this.name + "是我的名字");
        }
    }
function Child(n){
        Parent.bind(this,n)();
        Parent.call(this,n);
        Parent.apply(this,arguments);
    }
 var c = new Child("帅哥");
    console.log(c)
    c.skill();

bind,call,apply都可以  但是注意他们之间的格式。

2.原型对象继承

 function Parent(n){
        this.name = n;
    }
    Parent.prototype.skill = function(){
        console.log(this.name + "是我的名字");
    }

    function Child(n){}
    //注意对象的深浅拷贝
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i];
    }
     var c = new Child("帅哥");
    console.log(c)
    c.skill();

3.原型链继承

function Parent(n){
        this.name = n;
    }
    Parent.prototype.skill = function(){
        console.log(this.name + "是我的名字");
    }

    function Child(){}
    Child.prototype = new Parent("帅哥");
    //改变子的原型对象上的skill方法
    Child.prototype.skill = function(){
        console.log(12312312)
    }
    
    var c = new Child();
    console.log(c);
    c.skill();
//
 c是实例(对象),有__proto__属性,指向Child.prototype,是Parent的实例(对象),有__proto__属性,指向Parent.prototype

4.混合继承

    function Parent(n){
        this.name = n;
    }
    Parent.prototype.skill = function(){
        console.log(this.name + "是我的名字");
    }
    function Child(n){
        Parent.call(this,n)
    }
    for(var i in Parent.prototype){
        Child.prototype[i] = Parent.prototype[i]
    }
    var c = new Child("帅哥");
    console.log(c)
    c.skill();

通过将原型对象继承+构造函数继承混合的方法实现了既能继承构造函数又能继承原型,方便传参。

5.ES6继承(混合继承:构造函数+原型链)

class Parent{
        constructor(n) {
            this.name = n
        }
        skill(){
            console.log(this.name + "是我的名字")
        }
    }

    class Child extends Parent{
        constructor(n){
            super(n)
        }
    }
    var c = new Child("帅哥");
    console.log(c)
    c.skill();
检测构造函数和实例之间的关系:
Parent的prototype的对象是否是 c 原型;
       Parent.prototype.isPrototypeOf(c)
c是否是Child的实例;
      c instanceof Child ;

 

 

posted on 2019-09-21 08:58  四月as谎言  阅读(133)  评论(0编辑  收藏  举报

导航