2013-08-23 62 views
1

我正在做一些Node.js,我想用閉包表示來創建我的對象。我想我失去了一些東西,因爲簡單的東西一樣,這是不工作:JavaScript關閉操作

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

我還沒有嘗試過的參數..和仍然沒有工作。

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

然而,像這樣的工作:

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

我不明白爲什麼這是行不通的。

--Edited

感謝Amadan我發現這樣做的正確方法:

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

這樣 「名」 和 「用戶」 被封裝。

+0

有一點需要記住的是,使用這種方法'new Room()instanceof Room === false''。 – PeterT

+0

這有多糟糕? –

+0

很難說真的,總體來說可能不算太差。這種事情最終會導致一些模糊的錯誤或者可能阻止你做某件事情......很多'instanceof'的使用最終成爲反模式...... – PeterT

回答

4

return在構造函數中會覆蓋this。因此,要做到這一點,正確的方法是:

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

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

第一個廣告上的原始this一切;第二個替換this與你需要的一切。

+0

謝謝你。你的問題幫助我找到了正確的做法。我想封裝這些領域。 –