继承
对一个对象实现继承,拆分来看,实际就是对该对象的属性和方法分别实现继承。所以继承可分成两步,即对属性的继承和对方法的继承。
对属性的继承:在子级构造函数中调用父级构造函数,实现对属性的继承
<script>
function Person(name, sex)
{
this.name=name;
this.sex=sex;
}
Person.prototype.showName=function ()
{
alert(this.name);
};
//-------------------------------------
function Worker(name, sex, job)
{
//这里的this指向new出来的Worker对象
//构造函数伪装 调用父级的构造函数——为了继承属性
Person.call(this, name, sex);
/添加子类自己的属性
this.job=job;
}
var oW1=new Worker('blue', '男', '打杂的');
</script>
这里的Person.call(this, name, sex);Person()是构造函数,也是函数。
调用Person函数,里面的this.name=name,实际是为window添加name属性,这里的this实际指向的window。
而我们是要调用它为Worker的实例添加属性,所以这里用call这个方法,改变Person中的this指向,将this指向Worker的实例。
这样就是实现对Person构造函数属性的继承。
对方法的继承
方法一:通过原型来继承父级的方法
<script>
function Person(name, sex)
{
this.name=name;
this.sex=sex;
}
Person.prototype.showName=function ()
{
alert(this.name);
};
//-------------------------------------------------------------------------
function Worker(name, sex, job)
{
//this->new出来的Worker对象
//构造函数伪装 调用父级的构造函数——为了继承属性
Person.call(this, name, sex);
//添加子类自己的属性
this.job=job;
}
//通过原型来继承父级的方法
Worker.prototype=Person.prototype;
//添加子级自己的方法
Worker.prototype.showJob=function ()
{
alert(this.job);
};
var oW1=new Worker('blue', '男', '打杂的');
oW1.showJob();
</script>
这里直接通过原型来继承父级的方法,因为引用类型的问题,会使父级的方法受到子级方法的影响,无法实现独立。
方法二:通过for in,遍历父类的原型,一个一个的放进子类的原型里
<script>
function Person(name, sex)
{
this.name=name;
this.sex=sex;
}
Person.prototype.showName=function ()
{
alert(this.name);
};
//-------------------------------------
function Worker(name, sex, job)
{
//this->new出来的Worker对象
//构造函数伪装 调用父级的构造函数——为了继承属性
Person.call(this, name, sex);
//添加子类自己的属性
this.job=job;
}
//通过原型来继承父级的方法
//Worker.prototype=Person.prototype;
for(var i in Person.prototype){
Worker.prototype[i] = Person.prototype[i]
}
//添加子级自己的方法
Worker.prototype.showJob=function ()
{
alert(this.job);
};
var oW1=new Worker('blue', '男', '打杂的');
oW1.showJob();
</script>
方法三:使用第三方原型
//target为子级,origin为父级
function inhert(target, origin){
function Fn()
//借助第三方Fn的原型链,然后进行赋值
Fn.prototype = origin.prototype
//对Fn构造函数进行实例
//实例化此对象,赋值给子级构造函数的原型
target.prototype = new Fn()
//子级继承了父级的原型后,构造函数也发生了变化,这里需要还原回来
target.prototype.constructor = target
}