@Shimpanze

Почему функция-конструктор срабатывает без `new`, хотя, согласно документации, не должна?

Согласно официальной документации: https://learn.javascript.ru/constructor-new#funkts... - функция-конструктор, вызывается только через оператор new, и приводится следующий пример:

function User(name) {
  this.name = name;
}

let user = new User('Jack');
alert(user.name); // Jack


Но я, совершенно спокойно, вызываю её без оператора new, вот так:

function Foo(arg) {
  arg = arg += ' 42';

  this.bar = function() {
    return arg;
  };

  return this.bar();
}

console.log(Foo('some string')); // > some string 42


И всё прекрасно работает.

Это глюк Google Chrome или так и должно быть? Я запутался.
  • Вопрос задан
  • 157 просмотров
Решения вопроса 2
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
У вас примеры с new и без new не эквивалентны. Вы просто посмотрите, что там на самом деле находится в получаемых переменных:

function Foo(arg) {
    this.bar = function() {
        return arg;
    };

    return this.bar();
}

const notfoo = Foo('not foo');
console.log(notfoo); // "not foo", т.е. notfoo - это не новый Foo, это строка текста.
console.log(notfoo.bar); // undefined, что логично, у стандартной строки никакого bar нет.

const foo = new Foo('foo');
console.log(foo); // [object Object], т.е. вот это - настоящий новый Foo.
console.log(foo.bar); // function() { ... }, и метод bar в нем есть.
console.log(foo.bar()); // "foo"
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Это не официальная документация.
И в ней чётко написано, что «должна выполняться» — это соглашение, а сама такая функция во всём аналогична обычной (потому что она и является обычной функцией).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы