Добавлю к вышенаписанному, что работу оператора
new можно симитировать следующей функцией:
function newExpression(constructor) {
if ( typeof constructor !== 'function') {
throw new TypeError(constructor + 'is not a constructor');
}
var args = Array.prototype.slice.call(arguments, 1);
var obj = Object.create(constructor.prototype);
return constructor.apply(obj, args) || obj;
}
Демо.
В отличии такой имитации настоящий оператор
new успешно создаст экземпляр даже по забинженому на другой контекст конструктору (по факту, возвращенной
привязанной функции), так как оператор
new игнорирует преданное значение
this. Аргументы же будут применены из
[[BoundArguments]]:
var User = function(name) {
this.name = name;
}
User.prototype.getName = function() {
return this.name;
}
const obj = {};
User = User.bind(obj, "Sarah");
var john = new User('John');
console.log(john.getName()); // 'Sarah'
Спецификации
new и
[[Construct]]