简单聊聊javascript的继承;

在JS中继承是一个非常复杂的话题,比其他任何面向对象语言中的继承都复杂得多。
在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。在JS中想要达到继承公用成员的目的,需要采取一系列措施。JS属于原型式继承,得益于这种灵活性,我们既可以使用标准的基于类的继承,也可以使用更微妙一些的原型式继承。在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的。(这话是比较官方的说法,看着都很专业)

在说继承之前,首先得先回答一个问题,什么是继承?

我理解的继承,简单来说就是,
--1.在原有类的基础上,进行可操作的修改,得到一个崭新的类,这个类有原来类的功能,同时也有自己的功能;
--2.这个新的类,不会影响原有类的功能,不会相互干预;
这里肯定有人要问了,什么是‘可操作的修改呢?’说白了就是在不影响整个类的功能的前提下,进行的修改!这点和第二点略有重复,仔细想想,还是有所区别的!!!
下面开始说说常用的集中继承方式:

1.代码:

        function Person(name, sex) {
            this.name = name;
            this.sex = sex;
        }
        Person.prototype.showName = function() {
            console.log(this.name);
        }
        Person.prototype.showSex = function() {
            console.log(this.sex);
        }
        function work(name, sex, job) {
           //构造函数伪装调用父级的构造函数——为了继承属性
            Person.call(this, name, sex);
            //Person.apply(this, [name, sex]);  //此处的call与apply是有区别的,往下看
            this.job = job;
        }
        work.prototype = Person.prototype; //通过prototype继承父级的属性
        work.prototype.showJob = function() {
            console.log(this.job);
        }
        var s = new work('xue', 'nan', 'developer');
        s.showJob()  //developer

简单的解释一下上面的代码:首先写了一个很简单的构造函数,在函数的原型上分别添加了showName和showSex的方法;紧接着写了一个work()函数,这里注意work()里面的参数,多了一个job参数,这个参数就是要继承的参数, Person.call(this, name, sex);有人问这里的this指的是啥?看下图:


image.png

答案就是 <b>new出来的work对象!</b>
work.prototype = Person.prototype;这句话就是通过prototype继承父级的属性,name和sex;然后就是在work的基础上添加showJob方法;
最后就是new一个work对象,执行方法!最后work继承了Person的name和sex属性;是不是很好懂!

2.代码:

 function Person(name, sex) {
            this.name = name;
            this.sex = sex;
        }
        Person.prototype.showName = function() {
            alert(this.name);
        };
        Person.prototype.showSex = function() {
            alert(this.sex);
        };
        function work(name, sex, job) {
            Person.call(this, name, sex);
            this.job = job;
        }

        //1.原型链 通过原型来继承父级的方法
        //work.prototype=Person.prototype;

       // 2.原型链 通过原型来继承父级的方法(循环方法)
       // Person.prototype类型是object;
        for (var i in Person.prototype) {
            Worker.prototype[i] = Person.prototype[i];
        }
        Worker.prototype.showJob = function() {
            alert(this.job);
        };
        var p = new Person('xue', 'nan');
        var w = new work('xue', 'nan', 'developer');
        // p.showName();
        // p.showSex();
        // w.showName();
        // w.showSex();
        // w.showJob();

简单解释一下:work.prototype=Person.prototype;这里是通过原型链来继承父级的方法;这里肯定有人要问“什么是原型链?”后期会讲!!!

 for (var i in Person.prototype) {
       Worker.prototype[i] = Person.prototype[i];
 }

这里只是用不同方法,通过原型链来继承父级的方法,原理是一样的!

call与apply的区别

js中call和apply都可以实现继承,唯一的一点参数不同,func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])。
说简单一点,这两函数的作用其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。
如有错误请私信本人!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 5,278评论 3 12
  • 相关知识点 数据类型、运算、对象、function、继承、闭包、作用域、原型链、事件、RegExp、JSON、Aj...
    sandisen阅读 22,976评论 20 251
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 4,935评论 0 0
  • 我要写的不是爱情,是两个女生的友谊。 1.相识相知 认识家伙是在初二那年。 那年我因为上一学期期末考试超水平发挥,...
    春风巷72号阅读 4,440评论 7 9
  • 所以人为什么会这么深爱音乐会? 你在它里面会变得伟大, 但又不知道是自己伟大,还是它在伟大。
    長歌先生阅读 1,651评论 0 0