原生js实现继承的几种方式(call(), 原型继承,构造函数继承)

     要实现继承,基本的面向对象知识和原型链知识是必不可少的.今天简单聊一下,以后有时间详细说一下.

     1.继承的目的: 就是共享属性和方法.

     2.继承的实现方法: 原型链是实现继承的主要方式.改变作用域也算一种,也就是call()或者apply().

     3.构造函数式继承: (继承的是属性)将父类的构造函数在子类的函数体中执行,并且通过call改变this指向子类的实例;

     4.原型继承: 将子类的原型指向父类的实例.

      今天就先简单聊一下这两种方式:

       

 function Father(name, age) {
            this.name = name;
            this.age = age;
            this.sex = function () {
                console.log('温兆伦');
            };
            console.log('义不容情');          //  义不容情
            console.log(this.name);          //   123
        };

        
        function Son(name, sex) {
            Father.call(this, name);
        };

        Son('123');

   说明: 以上需求是想让Son方法共享Father方法的属性和方法;我们可以在Son方法内部改变Father方法执行时候的作用域;意思是Father方法执行的时候,内部的this已经变成Son方法的this;所以,下面Son方法执行,也可正常输出;这样就实现了让Son方法共享Father方法的属性和方法;

第二种方法:

function Father(name, age) {
            this.name = name;
            this.age = age;
            this.sex = function () {
                console.log('温兆伦');
            };
            console.log('义不容情');            // 义不容情
            console.log(this.name);            //   123
        };

        
        function Son(name, sex) {
            
        };
        
        Son.prototype = Father.prototype;
        Son.prototype.constructor('123');


        // 输出Son.prototype.constructor;
        var child = Son.prototype.constructor;
        console.log(child)                      //  ƒ Father(name, age) {
                                                          this.name = name;
                                                          this.age = age;
                                                          this.sex = function () {
                                                            console.log('温兆伦');
                                                        };
                                                          console.log('义不容情');
                                                      …

说明:目的同样是让Son方法共享Father方法的属性和方法;但此时利用的是原型链继承实现的.这个要了解一定的原型链知识才能看懂.简单说就是让Son方法的原型对象指向了Father方法的原型对象.因为函数的原型对象可以通过constructor访问到构造函数本身.所以,Son.prototype.consturctor其实就是指向的Father方法本身;如果还不理解,我在上面已经输出了.一看便懂.

 

    总结:当然,我没有new实例.其实原理都一样.今天也说不完,下次再说吧. 其实继承涉及到的东西很多很多.一句话两句说不完.比如call()的用法,函数this的指向问题,原型链知识.缺少哪一块也不太好理解继承.其实只要知道继承的目的和方法.从这两点出发再去理解继承.应该会容易理解很多.今天先说这么多吧.有空儿在好好探索下继承.

 

你可能感兴趣的:(javascript)