原型 - 为类添加功能

时间:2013-04-04 08:17:39

标签: javascript

我正在学习原型。将函数“sayName”放在类中或稍后通过原型添加它会更好吗?或者它是一样的,取决于具体情况?

function Animal(name,numLegs){
    this.name = name;
    this.numLegs = numLegs;
    this.sayName = function(){
         console.log("Hi my name is " + this.name);

    };
}


var penguin = new Animal("Captain Cook", 2);
penguin.sayName();

function Animal(name,numLegs){
    this.name = name;
    this.numLegs = numLegs;
}

Animal.prototype.sayName = function(){
    console.log("Hi my name is " + this.name);
};


var penguin = new Animal("Captain Cook", 2);
penguin.sayName();

3 个答案:

答案 0 :(得分:1)

它不一样,因为第一个版本将使用更多内存,因为Animal的实例具有自己的this.sayName。在后者中,所有Animal个实例都可以访问相同的 sayName

function Animal(name,numLegs){
    this.name = name;
    this.numLegs = numLegs;
    this.sayName = function(){
         console.log("Hi my name is " + this.name);
    };
}

var dog = new Animal(4, "Jack");
var alligator = new Animal(4, "Snap");

dog.sayName = function(){ console.log("woof"); }

dog.sayName();
alligator.sayName();

将导致

woof
Hi my name is Snap

因为dogalligator不共享相同的函数sayName,而后一个示例中对原型的更改会更改sayName的所有调用。< / p>

答案 1 :(得分:1)

最好将原型用于共享资源

答案 2 :(得分:1)

这个问题已经得到解答 - 这取决于具体情况。阅读此答案:https://stackoverflow.com/a/15497685/783743

如果您的方法需要访问构造函数的私有变量,那么除了在构造函数中定义它之外别无选择。否则,您应该始终在prototype对象上声明它们。

您还应阅读以下文章:

  1. http://javascript.crockford.com/private.html
  2. https://stackoverflow.com/a/8096017/783743