Javascript语言依靠一种”原型链”(prototype chain)模式,来实现继承。
举例一个叫做DOG的构造函数,表示狗对象的原型:
function DOG(name){
this.name=name;
}
对这个构造函数使用new,就会生成一个狗对象的实例:
var dog = new DOG('大龙');
alert(dog.name); //大龙
注意构造函数中的this关键字,它就代表了新创建的实例对象。
用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法。
比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species。
function DOG(name){ //构造函数
this.name = name;
this.species = '狗科'; //设置属性
}
var dogB = new DOG('大龙'); //生成实例对象
var dogD = new DOG('大门');
dogB.species = '龙'; //两个对象的species属性是独立的,修改其中一个,不会影响到另一个
alert(dogD.species); //显示狗科,不受dogB影响
每一个实例对象,都有自己的属性和方法的副本,无法分享一些相同的属性。
遂为构造函数设置一个prototype属性。这个属性包含一个prototype对象。
实例对象一旦创建,将自动引用prototype对象的属性和方法。实例对象的属性和方法,分成两种,一种是本地的,另一种是引用的。
function DOG(name){ //构造函数
this.name = name;
}
DOG.prototype = { species : '狗科' };
var dogB = new DOG('大龙');
var dogD = new DOG('大门');
alert(dogD.species); //狗科
alert(dogB.species); //狗科
species属性放在prototype对象里,是两个实例对象共享的。只要修改了prototype对象,就会同时影响到两个实例对象
DOG.prototype.species = '龙';
alert(dogB.species); //龙
alert(dogD.species); //龙