2015-09-10 3 views
0

Ниже у меня есть две функции-члены, SayHello и SayHi, что эффективно делать то же самое:Лучшая практика для объявления функции члена JavaScript

function Person (n) { 
 
\t this.name = n; 
 
\t this.sayHello = function() {console.log("Hello, my name is "+this.name);}; 
 
}; 
 
Person.prototype.sayHi = function() {console.log("Hi, I'm "+this.name);}; 
 

 
Jeff = new Person('Jeff'); 
 
Joe = new Person('Joe'); 
 

 
Jeff.sayHello() // returns "Hello, my name is Jeff" 
 
Joe.sayHi() /// returns "Hi, I'm Joe"
Я думал, что реализация мудр, они были идентичны, но теперь Я начинаю думать, что назначение функции прототипу создает только одно изображение функции, тогда как в функции объявляется «sayHello», поэтому новое изображение будет создаваться каждый раз при создании нового объекта Person? Это верно? Исходя из мира C++, я предпочитаю помещать объявление в функцию, но не хочу этого делать, если это приводит к раздуванию.

+1

Да, 'sayHi' является общим, и' sayHello' создается для каждого экземпляра. –

+0

Прототипы не могут получить доступ к «приватным» данным, если ваш конструктор имеет локальные переменные, метод прототипа не сможет получить к ним доступ. – Matthew

ответ

1

Вы правы, объявляя, что функция sayHello внутри функции конструктора Person создаст новую функцию каждый раз, когда вызывается эта функция, поэтому она тратит ресурсы. Однако это не тратит впустую значительного объема ресурсов, и если бы это было проблемой, тогда было бы несколько других гораздо более значительных проблем, чем просто одна из функций, которые были переопределены.

Что касается лучшей практики, то это в основном стиль. В общем, вы хотите придерживаться только прототипа для расширения.

Смежные вопросы