Пытаясь понять новое ключевое слово - PullRequest
2 голосов
/ 09 декабря 2011

Я пытаюсь точно понять, что означает ключевое слово javascript new, почему оно необходимо и когда я должен его использовать.

Рассмотрим следующие примеры:

      var x = new function(){
        var self=this;
        this.myFunction = function(){alert('foo ' + self.v)}
        this.v='x';
      };

      var y = function(){
        var self=this;
        this.myFunction = function(){alert('foo ' + self.v)}
        this.v='y';
        return this;
      }();


      var f=function(){
        var self=this;
        this.myFunction = function(){alert('foo ' + self.v)}
        this.v='z';
      }

      var z = new f();

      x.myFunction();
      y.myFunction();
      z.myFunction();

x,y и z все объекты.Потенциально с открытыми и закрытыми переменными-членами.

x и z, где построено с использованием нового ключевого слова.Насколько я могу судить, новое ключевое слово просто выполняет функцию и возвращает контекст.Таким образом, я предполагаю, что в приведенном выше примере x и y по сути являются одиночными, поскольку любая ссылка на исходную функцию потеряна?

Кроме того, все ли они в точности эквивалентны?Если нет, то в чем различия, и когда я хотел бы использовать один подход или избегать другого?

Спасибо за любые объяснения.

1 Ответ

2 голосов
/ 09 декабря 2011

Я пытаюсь точно понять, что означает ключевое слово javascript

a = new X() означает что-то вроде:

  • создать новый объект A
  • устанавливает свой прототип для объекта с именем X.prototype (все функции имеют свойство «prototype», которое является просто объектом, и вы можете изменить его, чтобы добавить поведение к объектам, созданным с использованием этой функции и new),
  • вызовите X с this = a для инициализации объекта.

Это похоже на:

a = Object.create(/* prototype */ X.prototype, {});
a.constructor = X; /* magic property which can be read after */
X.apply(/* this */ a, /* args */[]);

зачем это нужно и когда мне следует его использовать.

Это не так, и вам не нужно. Object.create более естественно работает с объектной моделью на основе прототипов JS и позволяет создавать произвольные цепочки прототипов.

Когда используется new, он используется так:

function Class(constructor_args) {
   // init an object
   this.a = 10;
};
Class.prototype.method1 = function() {
   console.log(this.a);
}
var obj = new Class();

Затем после создания объекта с использованием new Class() его прототип ссылается на объект Class.prototype, который содержит его методы, а сам объект содержит поля.

(Личное мнение: ключевое слово new было введено, чтобы упростить написание кода в Javascript, который напоминает Java / C ++ и классическую нетипизированную объектную модель.)

Пожалуйста, прочитайте эти прекрасные статьи:

Классическое наследование в Javascript

Прототип наследования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...