对JS继承的一点思考

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

举个例子,如今有一个叫作CAT的构造函数,表示猫对象的原型。java

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的影响

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

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

这样作的坏处就是会形成资源浪费,那么咱们要如何来解决这件事呢,那就须要prototype出场了。code

这个属性包含一个对象(如下简称"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对象,就会同时影响到两个实例对象。ip

相关文章
相关标签/搜索