面向对象之继承(拷贝继承)

js中的继承,个人觉得一直是js的软肋,当然自从es6中新增了extend,得到了很大的改观,我们今天不对extend做介绍,主要介绍一下js中最早实现继承的一些方法

function Person(name,age){
    this.name = name;
    this.age = age;  
}

Person.prototype.showName = function(){
     console.log(this.name);  
}

var p = new Person('张三',20);
p.showName();       //'张三';

上面是个简单的面向对象程序,我们来再写一个ExtendPerson对象来继承Person对象;

function ExtendPerson(name,age,job){
    Person.call(this,name,age);   //调用父类的构造函数,默认情况下this指向window,所以要改变this指向,使其指向当前的对象 
    this.job = job;   
}

以上代码实现了属性的继承,那么怎么继承父类的方法呢

ExtendPerson.prototype = Person.prototype;

我们把父类的原型,赋值给子类的原型,虽然这样确实可以将父类的方法继承过来,但是因为赋值就出现了对象的引用,也就意味着给子类添加方法父类也就拥有了添加的方法,这显然不是我们想要的结果,那么怎么办呢,可以这样

function extend(obj1,obj2){
   for(var attr in obj1){
        obj2[attr] = obj1[attr];
   }
}

我们封装一个方法,并调用

extend(Person.prototype,ExtendPerson.prototype);

这样我们就实现了方法的继承,这种方法我们称之为拷贝继承!jQuery中采用的就是这种方法!

 

posted @ 2018-04-13 11:32  阿弥陀佛么么哒!  阅读(411)  评论(0编辑  收藏  举报