在Javascript语言中,new命令后面跟的不是类,而是构造函数。

举个例子,现在有一个叫做CAT的构造函数,表示猫对象的原型。

function CAT(name){
    this.name = name;
    this.age = 3;
}

当我们new这个构造函数的时候,就会生成一个猫对象的实例。

var Tom = new CAT('Tom');
var Jack = new CAT('Jack');
Tom.age = 5;
alert(Tom.name+','+Tom.age);  //Tom,5
alert(Jack.name+','+Jack.age);  //Jack,3  不受Tom的影响

但是通过上面的例子你会发现:用构造函数生成实例对象,它有一个缺点,那就是无法共享属性和方法。

因为这两个对象的age属性是独立的,修改其中一个,不会影响到另一个。

这样做的坏处就是会造成资源浪费,那么我们要如何来解决这件事呢,那就需要prototype出场了。

这个属性包含一个对象(以下简称"prototype对象"),所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面。

CAT的代码利用prototype就可以改写成这样子了:
function CAT(name){
    this.name = name;
}
CAT.prototype.age = 3;
var Tom = new CAT('Tom');
var Jack = new CAT('Jack');
CAT.prototype.age = 5;
alert(Tom.name+','+Tom.age);   //Tom,5
alert(Jack.name+','+Jack.age);  //Jack,5

age属性放在prototype对象里,是两个实例对象共享的。只要修改了prototype对象,就会同时影响到两个实例对象。


shane_xu
1k 声望32 粉丝

喜欢美食的一个前端


« 上一篇
JS预编译