Литералы объекта должны быть статическим определением , в тот момент, когда вы выполняете вычисления или логику в объявлении литерала, оно сломается.Если вам нужна логика / вычисления, используйте вместо этого конструктор объекта .
Например,
var o = {
b: 4,
c: 8,
d: o.b + o.c
}
Будет вызывать TypeError
, поскольку o
не определено.Причина этого заключается в том, что литерал объекта создается сначала , а затем , присвоенному переменной o
.
Итак, пока вы создаете литерал объекта, объект o
не существует.
Следующее:
var o = {
b: 4,
c: 8,
d: this.b + this.c
}
Будет работать, но не так, как вы ожидаетеэто к.Вы не можете ссылаться на литерал объекта непосредственно в объявлении.Потому что this
связан с window
в этом примере, а не с o
.
Если вы хотите сделать логику, используйте конструктор
var o = new function() {
this.b = 4;
this.c = 8;
this.d = this.b + this.c;
}
или
var O = function() {
this.b = 4;
this.c = 8;
this.d = this.b + this.c;
}
var o = new O();
Вывод:
Пока объявление литерала объекта не содержит логики, оно безопасно.(Просто объявите функции и свойства со статическими значениями).
Если объявление содержит логику, оно должно быть в теле функции (как конструктор)