Define a "nested" object constructor in JavaScript?

javascript, nested, object

Solution

Yes, and no.

function MyObj(name) {
    this.name = name;
}
MyObj.EmbeddedObj = function EmbeddedObj(id) {
    this.id = id;
}
new MyObj.EmbeddedObj(42);

Would run, but it might not yield the expected results for "embedded object" (see comment).

Note that in the case of `new expr` the expression is evaluated first so, in this case it creates a new object using the function-object evaluated from `MyObject.EmbeddedObj` as a constructor. (There is a silly rule with parenthesis in the expression, but that's another story.)

Now, if a "parent" and "child" relationship was desired, that could be done, using a more round-about method:

function Parent (name) {
   this.name = name;
   var parent = this; // for closure
   this.Child = function Child () {
      this.Parent = parent;
   }
}

// create new parent object
var parent = new Parent();       
// each new parent has a different Child constructor and
// any function-object can be used as a constructor
var child = new parent.Child();
// true: child is "bound" to parent
child.Parent === parent;

Problem

Is it possible to define an object within another object? I'm thinking something like this: ``` function MyObj(name) { this.name = name; function EmbeddedObj(id) { this.id = id; } } ``` And I could then create an EmbeddedObj like this: ``` var myEmbeddedObj = new MyObj.EmbeddedObj(); ``` Meme for bonus points: Objectception! :o

Original source