Это не имеет ничего общего с синтаксисом, и в этих конструкторах нет ничего особенного.Number()
и другие конструкторы просто проверяют, связан ли this
перед продолжением.
Вы можете сделать это тоже:
function MyConstructor() {
if (!this) return new MyConstructor();
// stuff ...
}
Теперь вызов MyConstructor()
будет вести себя точно так жеnew MyConstructor()
.
Кроме того, конструктор может вернуть что-то.Если он возвращает объект, то он используется вместо неявно созданного объекта, который создает new
.Таким образом, вы могли бы также реализовать конструктор «новый-необязательный» другим способом:
function MyConstructor() {
let object = this || Object.create(MyConstructor.prototype);
// stuff ...
return object;
}
Таким образом, конструктор Number()
принимает другую тактику.В большинстве сред выполнения он может или не может быть реализован как JavaScript, но если бы это было так, он мог бы выглядеть примерно так:
function Number(n) {
if (this) {
// invoked with "new"
this.fantasyValueSetter(n); // cannot really do this
return this;
}
return +n; // plain number primitive if not invoked with "new"
}