继承
1.原型链继承
2.借用构造函数继承 经典继承
3.组合继承 1+2
实例去访问一个方法或者属性
1.先去自身查找有没有这个属性
2.再去原型对象中去查找这个方法或者这个属性
3.就去父构造函数原型对象中去访问属性和方法
function Person(){}
var p1 = new Person();
Person.prototype ;//{}
p1.say();
//原型链继承 子构造函数的原型对象指向父构造函数的实例
Person.prototype = new Object();
例:
/**
* 继承
* 1.借用构造函数继承 经典继承
* 2.原型链继承
* 3.组合继承
*/
/**
* 创建构造函数 声明父构造函数
*/
function Animal(type,age,weight,length){
this.type = type;
this.age = age;
this.weight = weight;
this.length = length;
}
/**
* 将公共方法写在原型对象
*/
Animal.prototype = {
constructor:Animal,
sayType:function(){
console.log(this.type)
}
};
/**
* 声明子构造函数
*/
function Dog(type,age,weight,length,name,color){
/**
* new Dog()
* this --->dog实例
*/
// 1.借用构造函数继承 经典继承
/**
* 调用父构造函数并且将this指向修改为子构造函数实例
*/
Animal.call(this,type,age,weight,length);
// Animal.apply(this,[type,age,weight,length]);
// Animal.bind(this,type,age,weight,length)();
this.name = name;
this.color = color;
}
//原型链继承 子构造函数的原型对象指向父构造函数的实例
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
Dog.prototype.sayColor = function(){
console.log(this.color)
};
// Dog.prototype.sayType = function(){
// console.log('我是子构造函数原型对象')
// }
var d1 = new Dog('狗',1,'10kg','50cm','可乐','白色');
console.log(d1);
d1.sayType();
d1.sayColor();
运行结果:
Dog {
type: '狗',
age: 1,
weight: '10kg',
length: '50cm',
name: '可乐',
color: '白色'
}
狗
白色