Javascript литерал против функции уп - PullRequest
5 голосов
/ 05 августа 2011

Какую практику лучше использовать?объясните важность двух, и какой из них является предпочтительным выбором в сообществе oop?любое слово мудрости поможет.Я также провел некоторые исследования, но ничего не вышло.ценится много мыслей.

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

Основное отличие состоит в том, что первая версия предоставляет переменную «а», а вторая скрывает ее.Поэтому, если вы не хотите или не нуждаетесь в клиентском коде для доступа к x.a, вторая версия предпочтительна.

Третий подход заключается в использовании прототипа.В этом случае локальная переменная в конструкторе не принесет вам большой пользы, поэтому, если eat() нужен доступ к a, вы должны написать:

function x() {
    this.a = 'a';
}

x.prototype.eat = function() {
    // do stuff with this.a
}

В этом случае каждыйЭкземпляр имеет новую копию a, но есть только одна копия eat.Недостатком (если вы считаете это одним) является то, что a доступен для пользователей x экземпляров.

3 голосов
/ 05 августа 2011

Первый просто создаст отдельный объект, вы не можете использовать его с ключевым словом new.Вторая содержит локальную переменную a вместо создания свойства, подобного первому.

Функции обычно пишутся как именованные функции вместо анонимных функций, назначенных переменным:

function x() {
  this.a = 'a';
  this.eat = function() {};
}

Теперь вы можете создавать объекты, используя его:

var y = new x();

Еще один способ указать методы для объекта - поместить его в прототип:

function x() {
  this.a = 'a';
}

x.prototype.eat = function() {};
2 голосов
/ 05 августа 2011

Обычно это зависит от того, что вы пытаетесь получить.Помните, что у JS нет реальных классов, его язык основан на прототипах.Оператор new вводит в заблуждение.

Я бы предложил использовать литерал {} всякий раз, когда это возможно.Например, вы можете сделать это так:

var myconstr = function(param){
    var pr = 'some private var';
    return {
         a : param,
         get2a : function(){ return this.a; }
    };
};

Если вам нужен только один экземпляр, вы всегда можете вызвать эту функцию сразу после ее определения.

НО, если вы хотите использовать prototype, это может быть проще с помощью функции Construction - но тем не менее я бы не использовал новый оператор как есть, возможно, лучше обернуть его в какой-нибудь другой функционал.

...