Can I reference other properties during object declaration in JavaScript?

Javascript

Javascript 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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsergView Question on Stackoverflow
Solution 1 - JavascriptIvo WetzelView Answer on Stackoverflow
Solution 2 - JavascriptkenView Answer on Stackoverflow
Solution 3 - Javascriptkemiller2002View Answer on Stackoverflow
Solution 4 - JavascriptHerbi ShtiniView Answer on Stackoverflow
Solution 5 - Javascriptuser113716View Answer on Stackoverflow
Solution 6 - JavascripthvgotcodesView Answer on Stackoverflow
Solution 7 - JavascriptfuzzyTewView Answer on Stackoverflow