Номер против нового Номер внутренней реализации - PullRequest
0 голосов
/ 17 октября 2018

Я понимаю, что пишу

var x = Number("7"); // makes a number, a primitive
var y = new Number("7"); // makes a Number object

и мне известны обычные предостережения против варианта 2, но что происходит за кулисами?У меня сложилось впечатление, что если функция является конструктором, она не должна возвращать значение с помощью оператора return: она просто устанавливает свой неявный объект this и возвращает его.

Так как же получается Number, String,и булевы конструкторы могут вернуть либо примитив, либо объект?Механизм JavaScript по-разному анализирует эти выражения как особенность языка?Или же программист может также «перегрузить» функцию конструктора, чтобы он возвращал примитив или объект, в зависимости от того, вызывается ли конструктор с / без «new»?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

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

Таким образом, в основном внутри Number объект, функция проверяет, как был вызван.Это возможно, проверив объект this.

Что-то интересное - это приведение объекта Number к числовому значению следующим образом:

var x = Number("7"); // makes a number, a primitive
var y = new Number("7");

console.log(x === +y)

Пойдите и прочитайте о спецификации

https://www.ecma -international.org / ecma-262 / 5.1 /# сек-15,7

enter image description here

0 голосов
/ 17 октября 2018

Это не имеет ничего общего с синтаксисом, и в этих конструкторах нет ничего особенного.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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...