Rodrigo Almeida
Rodrigo Almeida

Reputation: 856

JavaScript Closures Manipulation

I'm doing some Node.js and I want to use the closure representation to create my objects. I think I'm missing something, because something simple like this isn't working:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
    return {
        getName : function() {
            return this.name;
        }
    }
}
var room = new Room("foo");
console.log(room.getName());

I also have tried without the parameter.. and still not working.

var Room = function() {
    this.name = "foo";
    this.users= [];
    return {
        getName : function() {
            return this.name;
        }
    }
}
var room = new Room();
console.log(room.getName());

However, something like this works:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
}
var room = new Room("foo");
console.log(room.name);

I can't understand why this isn't working.

--Edited

Thanks to Amadan I have found the right way to do it:

var Room = function() {
    var name = "foo";
    var users= [];
    return {
        getName : function() {
            return name;
        }
    }
}
var room = new Room();
console.log(room.getName());

This way "name" and "users" are encapsulated.

Upvotes: 1

Views: 74

Answers (1)

Amadan
Amadan

Reputation: 198324

return in a constructor will overwrite this. So the right way to do this is:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
    this.getName = function() {
        return this.name;
    }
}

or

var Room = function(foo) {
    return {
        name: "foo",
        users: [],
        getName : function() {
            return this.name;
        }
    }
}

The first one does everything on the original this; the second one replaces this with everything you need.

Upvotes: 4

Related Questions