在原型中存储方法

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方法只被创建了一次,对象实例间通过原型来共享它们。
将方法存储在原型中,可以使其被所有的实例共用,而不需要存储方法实现多个副本。
所以,将方法存储在原型中好过存储在实例对象中。


你可能感兴趣的:(在原型中存储方法)