Что делает новое ключевое слово под капотом?
Мне любопытно, что еще ключевое слово 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: ...
}
}();
Ответы
Ответ 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
может быть медленнее, поскольку он включает в себя дополнительные шаги по созданию объекта и присвоению ему нескольких свойств.