简单聊聊javascript的继承;

2017-05-09  本文已影响0人  殖民_FE

在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编程过程中有时是很有用的。
如有错误请私信本人!

上一篇 下一篇

猜你喜欢

热点阅读