2013-04-04 5 views
1

Im curently узнает о прототипе. Лучше ли поместить функцию «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(); 
+0

возможный дубликат [Переопределение методов в Javascript] (http://stackoverflow.com/questions/15497259/ overriding-methods-in-javascript) –

ответ

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 

потому dog и alligator не разделяют же функцию sayName, в то время как изменения в прототип в последнем примере изменит все вызовы sayName.

1

Лучше использовать прототип для общих ресурсов

+0

Ловушка была бы, если бы вы использовали простые объекты в прототипе - их можно удивительно мутировать из одного экземпляра в другой. – David

1

Этот вопрос уже был дан ответ - это зависит от ситуации. Прочтите этот ответ: https://stackoverflow.com/a/15497685/783743

Если вашему методу необходимо получить доступ к закрытым переменным конструктора, то у вас нет другого параметра, кроме определения его внутри конструктора. В противном случае вы всегда должны объявлять их на объекте prototype.

Вы должны также прочитать следующие статьи:

  1. http://javascript.crockford.com/private.html
  2. https://stackoverflow.com/a/8096017/783743
Смежные вопросы