为什么使用prototype作为方法而不是this.methodName

时间:2011-09-22 07:46:49

标签: javascript oop prototype-programming

  

可能重复:
  Advantages of using prototype, vs defining methods straight in the constructor?

为什么要使用:

Person.prototype.toString = function() { return this.name; }

Function Person(name) { 
    this.name = name;
    this.toString = function() { 
        return this.name;
    } 
}

3 个答案:

答案 0 :(得分:4)

嗯,你应该使用原型,因为代码重用和继承 基本上,如果将方法绑定到this关键字,则只将该方法提供给该特定实例,而使用原型时,可以为该类的所有实例编写方法。
例如:

function Person(name) {
    this.name = name;
    this.toString = function() {
        return this.name;
    }
}
var bob = new Person('Bob');
var jim = new Person('Jim');
jim.toString = function() {
    return "I have amnesia, I forgot my name!";
};

现在,尽管bobjim都是人(同一个类的实例),但它们的行为却不同,因为它们有自己依赖的规则(方法)。 /> 如果您要使用原型:

function Person(name) {
   this.setName(name);
}
Person.prototype = {
    name : 'default name',
    setName : function(name) {
        this.name = name;
    },
    toString : function() {
       return this.name;
    }
};
var bob = new Person('Bob');
var jim = new Person('Jim');
Person.prototype.toString = function() {
    return "I have amnesia, I forgot my name!";
};

现在,你所有的人都表现得一样 使用原型继承有利于代码重用,并且不会使用不必要的重复内容加载内存。 +通过这种方式更新就更容易了。

答案 1 :(得分:2)

一个原因是因为它会将该函数更新/添加到已经创建的那种类型的对象中。

function Person(name) { 
    this.name = name;
}

var person = new Person("Test");
alert(person.toString()); // alerts [object Object]

Person.prototype.toString = function() {
    return this.name;
};
alert(person.toString()); // alerts Test

http://jsfiddle.net/28puy/

答案 2 :(得分:1)

在javascript中,方法是对象。在第二个Person构造函数中,您将为Person的每个实例创建一个新的toString函数实例。通过使用原型对象,只有一个toString函数的实例将在Person的所有实例之间共享。