引言
上一节《javascript基础–对象(Object)封装》讲了如何造人,这一节将会总结怎么理清人与人之间的血缘关系,即继承关系。对象继承简单地分为两类,构造函数继承和非构造函数继承。所谓构造函数继承就是利用this绑定对象的模式创建的对象之间的继承关系;而非构造函数继承就是利用对象字面量创建的对象之间的继承关系。上代码:
//Person父对象利用this绑定,子对象Tom,Linda也同样采用这种模式创建
function Person(name,sex){
this.name = name;
this.sex = sex;
}
Person.prototype.say = function(){
console.log(this.name +' is ' + this.sex);
}
//创建的Tom,Linda去继承Person父对象,此种继承成为构造函数继承
//Person采用对象字面量创建,子对象Tom,Linda也同样采用这种模式创建
var Person = {
Pname: 'Person',
Psex: 'Person sex is male or female',
say: function(){
console.log('haha');
}
}
//创建的Tom,Linda去继承Person父对象,此种继承成为非构造函数继承
1.构造函数继承
首先确定父对象,即引言内的父对象,copy下来
function Person(name,sex){
this.name = name;
this.sex = sex;
}
Person.prototype.say = function(){
console.log(this.name +' is ' + this.sex);
}
我们的任务是创建Tom和Linda去继承Person,我们先创建子对象模型
//Tom构造函数
function Tom(name,sex){
}
Tom.prototype = {}
var T = new Tom('Tom','male');
//Linda构造函数
function Linda(name,sex){
}
Linda.prototype = {}
var L = new Linda('Linda','female');
分析:父对象Person中属性和方法分为两部分,name和sex属性是在构造函数Person上,而say方法是在Person.prototype上。所以要继承Person所有属性和方法,分为两步,即继承构造函数上的属性和继承原型对象上的方法。
2.构造函数继承–对象冒充
对象冒充,是利用call或者apply方法,将父对象的属性和方法绑定在子对象上,从而完成构造函数上属性和方法的继承,但是person原型对象上的say方法不会继承。这里简单介绍一下call和apply
//call定义
A.call(B,Object);
//释义:调用A对象的方法,以B对象替换当前的A对象,其中参数是Object
//apply定义
A.apply(B,array);
//释义:调用A对象的方法,以B对象替换当前的A对象,其中参数必须是Array类型
//so call和apply区别就在参数的形式上不同
现在来完善Tom和Linda构造函数
//Tom构造函数
function Tom(name,sex){
Person.apply(this,arguments);
}
Tom.prototype = {}
var T = new Tom('Tom','male');
//Lin