javascript的继承机制基于原型,JavaScript中并没有类的概念,对象是从其他对象中继承而来。被继承的对象称为原型。
function User(name,password){
this.name = name;
this.password = password;
}
User.prototype.toString = function(){
return "[User" + this.name + "]";
}
User.prototype.checkPassword = function(password){
return password === this.password;
}
var u1 = new User(/*....*/);
var u2 = new User(/*....*/);
var u3 = new User(/*....*/);
User函数自带一个默认属性prototype属性,User.prototype包含一个几乎为空的对象。然后我们添加了两个方法到User.prototype对象中。当我们使用new操作符创建User实例时,产生的对象u得到了自动分配的原型对象,该原型对象被存储在User.prototype中。toString方法和checkPassword方法存储在原型中,可以被所有继承该原型对象的实例所共用。
但当我们构造多个User实例时不借助User.prototype中定义的方法时,会有一个重要的区别。
function User(name,password){
this.name = name;
this.password = password;
this.toString = function(){
return "[User" + this.name + "]";
};
this.checkPassword = function(password){
return password === this.password;
};
}
var u1 = new User(/*....*/);
var u2 = new User(/*....*/);
var u3 = new User(/*....*/);
上面的这个User函数的行为和之前的几乎是一样的,但是其每个实例中都包含toString和checkPassword方法的副本,所以总共有6个函数对象。但原来的函数中toString和checkPassword方法只被创建了一次,对象实例间通过原型来共享它们。
将方法存储在原型中,可以使其被所有的实例共用,而不需要存储方法实现多个副本。
所以,将方法存储在原型中好过存储在实例对象中。