8

I have a object literal:

var obj = {
    a : document.getElementById("ex1"),
    b : obj.a.document.getElementsByTagName("div")
};

I am having trouble with the b property, for some reason it is not letting that happen. Is this possible?

1

3 Answers 3

6

The modern way to do this is with getter methods:

let obj = {
  firstName: "A’dab",
  lastName: "Farooqi"
  get fullName() {
    return this.firstName+" "+this.lastName;
  },
}

So now you can just write obj.fullName - no need for the parentheses on the end.

Sign up to request clarification or add additional context in comments.

2 Comments

This should be accepted as the corrected answer, given the most recent updates of the JavaScript. Also, this his a powerful feature that should be more disseminated among developers.
Seconded - I wish I'd learned about this a long time ago. This is incredibly useful for establishing complex configurations with generic callables for some properties.
2

You need two steps:

var obj = {
    a : document.getElementById("ex1")
};

obj.b = obj.a.document.getElementsByTagName("div")

Or:

var temp = document.getElementById("ex1")
var obj = {
    a : temp,
    b : temp.document.getElementsByTagName("div")
};

Comments

2

When the property b is being defined, obj is not defined yet. One way to get around that problem is to make your property a function so that it's not evaluated until called.

var obj = {
    a : document.getElementById("ex1"),
    b : function() {
      // This is not evaluated until obj.b() is called
      return obj.a.document.getElementsByTagName("div");
    }
};
obj.b();

If you really want it to be a property, you have to do it in two steps as Tomasz Nurkiewicz shows

3 Comments

You could use a getter method in browsers that support it var obj={a:document.getElementById("ex1"),get b(){return this.a.document.getElementsByTagName("div")}};
@Pumbaa80 By browsers that support it, you mean Firefox only??? A better approach would be to use Object.defineProperty since it's available in the latest version of all browsers, but that also requires multiple steps
Actually, all browsers but IE<=8 support it. Browser support for defineProperty is the same.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.