JS面向对象之拷贝继承

版权声明:可任意转载,转载注明出处。 https://blog.csdn.net/Handsome_fan/article/details/80727689

JS中的继承和我们现实当中的继承类似,就是子类(继承者)拥有父类(被继承者)的所有特性(属性与方法),同时子类又可以拥有自己特定的属性或方法(基因突变),而且子类的改变不会影响到父类。我们为什么要继承呢?其实主要是为了代码复用。
继承分两个部分,第一是属性的继承,第二是方法的继承
我们先创造一个简单的父类:

function CreatePerson(name,sex){   //父类
    this.name = name;
    this.sex = sex;
}

这个父类有两个属性name和sex。
我们再往这个父类身上添加一些功能(方法):

CreatePerson.prototype.showName = function(){
    alert( this.name );
};

这个父类就有了showName这个方法,然后我们就去实例化它:

var p1 = new CreatePerson('小明','男');

我们可以在Chrome的控制台那里打印一下p1这个对象,看看它有什么:
这里写图片描述
接下来,我们定义一个子类,这个子类继承CreatePerson。

function CreateStar(name,sex,job){  //子类
    CreatePerson.call(this,name,sex);
    this.job = job;
}

我们通过在子类内部调用父类CreatePerson的构造函数,利用call改变this指向,使子类拥有了父类的所有属性(属性继承)。这个子类也有自己独特的属性job(基因突变)。
这个子类CreateStar继承了父类CreatePerson的属性后就要继承父类的方法了,这里我们用拷贝继承的编程技术,因为直接把父类的原型对象赋给子类的原型对象(CreateStar.prototype = CreatePerson.prototype)会造成对象间的引用,这不符合继承的定义,因为对象间的引用会使得子类的改变影响到父类,就是父类会随着子类的改变而改变,这就麻烦了。
定义一个继承的方法:

/**
 1. 子类继承父类函数的方法
 2. @param obj1 子类
 3. @param obj2 父类
 */
function extend(obj1,obj2){
    for(var attr in obj2){
        obj1[attr] = obj2[attr];
    }
}

子类CreateStar要继承父类CreatePerson的方法,只要直接调用extend这个方法就可以了。

extend( CreateStar.prototype , CreatePerson.prototype );

我们再定义子类CreateStar特有的方法:

CreateStar.prototype.showJob = function(){
};

这样,子类拥有了showJob方法后就不会因为对象间的引用的原因,使得父类也有showJob方法了。
我们实例化一下这个子类:

var p2 = new CreateStar('刘德华','男','演员');

此时,我们可以在Chrome的控制台那里打印一下p1和p2这个两个对象,看看它们的区别:
这里写图片描述
总结:
1. 继承的定义
2. 属性继承与方法继承
3. 拷贝继承extend方法

猜你喜欢

转载自blog.csdn.net/Handsome_fan/article/details/80727689