I do:
outerobject={
a: 1,
b: 2,
c: this.a + this.b,
};
console.log(outerobject.a);
console.log(outerobject.b);
console.log(outerobject.c);
I expect:
1
2
3
I get:
1
2
NaN
Why do I get a NaN?
Within the object this is assigned a reference to the window or the global object. You need to use a function which will have this refer to a reference of the object.
var outerobject={ a: 1, b: 2, c: function(){return this.a + this.b}};
var outerobject2={ a: 1, b: 2, c: console.log(this)}; //logs window/global object
console.log(outerobject.c());//outputs 3
or use a function constructor:
function MyObject(){
this.a = 1;
this.b = 2;
this.c = this.a + this.b;
console.log(this);
}
var myObject = new MyObject();
The key is the function determines the scope of this. When a function is called as a method of an object, its this is set to the object the method is called on.
JS Fiddle: http://jsfiddle.net/aRFLn/
getC()) and property created inside a constructor won't update it's value as someone may expect.You probably want to get the sum of property values a and b. You'll need a getter for this:
var outerobject = {
a: 1, // inside a property value `this` is `window`
b: 2,
get c() {
return this.a + this.b; // inside a getter function 'this' is `outerobject`
}
};
Then you can use outerobject.c. It will also be re-evaluated each time you call it:
outerobject.c; // 3
outerobject.a++;
outeobject.c; // 4
key:valueIn your case 'this' could be any number of things depending on where this is being called. In your case it most likely is the window object. Since window probably doesn't have a and b defined so you get NaN.
Here's a good example on how this works: http://www.quirksmode.org/js/this.html
thisisn'touterobject. Add"use strict";at the top of your code and you'll get a nice error message instead of a silent failure:TypeError: Cannot read property 'a' of undefined.thisset.