Подтвердить что ты не робот

Что делает новое ключевое слово под капотом?

Мне любопытно, что еще ключевое слово 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 мс), на больших объектах все еще значительно быстрее?

[изменить]

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

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

    // Lots of code
}();

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

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

Ответ 1

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

Если оператор new был методом вместо оператора, он может быть реализован следующим образом:

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

   // Create a new object that inherits from the 
   // constructor 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 реализуется следующим образом. Это добавляет метод экземпляра в класс (Источник):

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

Дальнейшее чтение:

Ответ 2

Прочитайте спецификацию. Разделы 11.2.2 и 13.2.2 актуальны и aren "Трудно понять (обратите внимание, что последние две ссылки относятся к неофициальной версии спецификации спецификации HTML).

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