Что новое ключевое слово делает под капотом? - PullRequest
15 голосов
/ 06 сентября 2010

Мне любопытно, что еще делает ключевое слово new в фоновом режиме, кроме изменения того, что относится и к области действия this.

Например, если мы сравниваем использование ключевого слова new для созданияФункция устанавливает свойства и методы объекта, чтобы просто заставить функцию возвращать новый объект. Есть ли что-то еще, что делает новый объект?

И что предпочтительнее, если я не хочу создавать несколько объектов изконструктор функции

var foo2 = function () {
  var temp = "test";

  return {
    getLol: function () {
      return temp;
    },

    setLol: function(value) {
      temp = value;
    }
  };

}();

var foo = new function () {
  var temp = "test";

  this.getLol = function () {
    return temp;
  }

  this.setLol = function(value) {
    temp = value;
  }
}();

Профилировщик Firebug говорит мне, что использование нового ключевого слова немного быстрее (2 мс вместо 3 мс), на больших объектах новое еще значительно быстрее?

[Редактировать]

Другое дело, что действительно большие конструкторы объектов имеют возврат в нижней части функции (он будет иметь большое количество локальных функций) или несколько this.bar = ... вверху функцииболее читабельным?Что считается хорошим соглашением?

var MAIN = newfunction() {
    this.bar = ...

    // Lots of code
}();

var MAIN2  = function() {
    // Lots of code

    return {
        bar: ...
    }
}();

Ответы [ 2 ]

17 голосов
/ 06 сентября 2010

Цитата Дуглас Крокфорд из Книга хороших запчастей (стр. 47), чтобы ответить на заголовок этого вопроса:

Если бы оператор new был методом вместо оператора, он мог бы быть реализован так:

Function.method('new', function () {

   // Create a new object that inherits from the 
   // constructor's prototype.

   var that = Object.create(this.prototype);

   // Invoke the constructor, binding -this- to
   // the new object.

   var other = this.apply(that, arguments);

   // If its return value isn't an object,
   // substitute the new object.

   return (typeof other === 'object' && other) || that;
});

Метод Function.method реализован следующим образом. Это добавляет метод экземпляра к классу ( Source ):

Function.prototype.method = function (name, func) {
   this.prototype[name] = func;
   return this;
};

Дополнительная литература:

6 голосов
/ 06 сентября 2010

Чтение спецификация . Разделы 11.2.2 и 13.2.2 актуальны и не слишком сложны для понимания (обратите внимание, что последние две ссылки относятся к неофициальной HTML-версии спецификации) .

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

...