Can I reference other properties during object declaration in JavaScript?
JavascriptJavascript Problem Overview
I am trying to do something like this:
var obj = {
a: 5,
b: this.a + 1
}
(instead of 5 there is a function which I don't want to execute twice that returns a number)
I can rewrite it to assign obj.b
later from obj.a
, but can I do it right away during declaration?
Javascript Solutions
Solution 1 - Javascript
No. this
in JavaScript does not work like you think it does. this
in this case refers to the global object.
There are only 3 cases in which the value this
gets set:
The Function Case
foo();
Here this
will refer to the global object.
The Method Case
test.foo();
In this example this
will refer to test
.
The Constructor Case
new foo();
A function call that's preceded by the new
keyword acts as a constructor. Inside the function this
will refer to a newly
created Object
.
Everywhere else, this
refers to the global object.
Solution 2 - Javascript
There are several ways to accomplish this; this is what I would use:
function Obj() {
this.a = 5;
this.b = this.a + 1;
// return this; // commented out because this happens automatically
}
var o = new Obj();
o.b; // === 6
Solution 3 - Javascript
This should return the correct values:
function () {
var aVar = 5;
var bVar = aVar + 1;
return {
a : aVar,
b : bVar;
}
}();
Solution 4 - Javascript
As it turns out you can't reference an object inside another object unless the first one is a function. But you can do it this way.
var obj = {
a: 5
}
obj.b = obj.a + 1; // create field b in runtime and assign it's value
If you console.log(obj) you will have
obj = {
a: 5,
b: 6
}
This way you keep the object literal structure for the remaining part of the code
Solution 5 - Javascript
No, in your example, the value of this
doesn't refer to the object literal.
You'll need to assign a value to b
after the object has been created in order to base it on another property in obj
.
Solution 6 - Javascript
in chrome debugger
> var o = {a: 5, b: this.a+1}
undefined
> o.b
NaN
> o.a
5
Solution 7 - Javascript
No. this
will take the same meaning as it would outside the definition.