#javascript
#javascript
Вопрос:
У меня есть функция JavaScript с именем foo. x — это глобальная переменная, которую мы увеличиваем в этой функции. затем я помещаю this.x = x и возвращаю функцию. затем я определил переменную bar = new new foo() . после выполнения этого кода значение bar.x не определено. но почему?
var x=0;
function foo(){
x ;
this.x = x;
return foo;
}
var bar = new new new foo;
console.log(bar.x);
Комментарии:
1. Отложив в сторону, что вы возвращаетесь
foo
из конструктора вместоthis
и забываете()
при вызове конструктора (т.Е.new foo
Вместоnew foo()
): Как вы думаете, сnew new new foo()
чем бы вы справились (т.Е. 3 разаnew
)2. @derpirscher добавление
()
при использованииnew
оператора в конструкторе не обязательно.3. Мне любопытно, каков распространенный вариант использования new new new foo? Тогда каким будет ожидаемое значение new new new new new new new new foo ? Какова цель этого вопроса? И это не ваша функция, та же функция была объяснена в другом месте.
Ответ №1:
Поведение вашего кода является прямым результатом природы конструкторов JS и new
оператора. Кроме того, он ведет себя так, как ожидалось. Однако я предполагаю, что ваш вопрос носит чисто теоретический характер, потому что я действительно не вижу подходящего варианта использования для объединения нескольких new
операторов в цепочку.
В вашем коде foo
есть конструктор, и его единственная цель — указать тип экземпляра, который должен быть создан. Другими словами, его форма / структура.
Когда вы используете new
оператор в конструкторе, он создает простой пустой объект и связывает с ним функцию конструктора ( instance.constructor
) , затем он присваивает этот вновь созданный объект this
контексту функции и запускает его.
Если функция возвращает объект, то new
возвращает и этот объект! Если нет, то new
автоматически возвращает этот первый созданный объект ( this
).
В вашем случае вы возвращаете ссылку на свой собственный конструктор. Это объект. Итак, new foo;
всегда возвращается конструктор. Вот почему вам разрешено связывать несколько new
операторов, что невозможно при использовании стандартного конструктора.
Чтобы получить значение x
, вы должны вернуть this
значение внутри своего конструктора или вообще не возвращать объект.
Надеюсь, это прояснит внутреннюю механику этого.
О! И, несмотря на общие знания, использование ()
при использовании new
operator не обязательно.
Наконец, чтобы замкнуть кольцо, пожалуйста, посмотрите Следующий фрагмент, используя ваш код:
let x = 0;
function Foo(c){
x ;
this.x = x;
return c ? this : Foo;
}
new new new new new new new new new Foo;
const bar = new Foo(1);
console.log(bar.x); // EXPECTED TO PRINT 10.
Комментарии:
1. Хотя использование
()
с конструктором без параметров может быть необязательным, это определенно хороший стиль, и большинство линтеров по умолчанию выдают предупреждение, когда вы их пропускаете.2. @derpirscher я всегда использую
()
, но я думаю, что весь смысл этого вопроса заключался в том, чтобы раздвинуть границы конструкторов JS.