Javascript继承

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);  //龙