2012-09-25 76 views
2

我對javascript模塊和類感到困惑。我試圖創建我的類的對象,但它總是說「不能設置未定義的屬性」或「對象沒有方法」。 還有就是我的模塊2.js:Javascript無法實例化模塊中的對象

(function() { 

var Game = function() { 
    this.state = 'a'; 
}; 

Game.prototype.somefunc = function() { 
    console.log(this.state); 
}; 

})(); 

這是主要的應用程序代碼:

var g = require('./2.js'); 

var mygame = new g.Game; 
mygame.somefunc(); 

//undefined is not a function error 

var g = require('./2.js'); 

var mygame = g.Game; 
mygame.somefunc(); 

//cannot call method of undefined error 

我在做什麼錯?

+0

你不會導出你的Game對象(它被封裝在一個匿名閉包函數中),嘗試聲明(只是一個間隙解決方法)Game對象就像這個'Game = function(){}'沒有'var'關鍵詞。 – Arnab

+0

[This answer](http://stackoverflow.com/a/5311377/615754)可能有幫助... – nnnnnn

回答

0

在你的第一個遊戲函數中,它只存在於(function(){})()閉包中。它在它自己的小宇宙中生存並死在裏面。

你必須暴露在外面。

的「VAR」在

var Game = function(){} 

意味着其僅封閉的範圍內限定。

你需要的東西是這樣的:

var g = require('./2.js'); 

(function() { 

    var Game = function() { 
     this.state = 'a'; 
    }; 

    Game.prototype.somefunc = function() { 
     console.log(this.state); 
    }; 

    g.Game = Game; 

})(); 

var mygame = new g.Game; 
mygame.somefunc(); 

現在你的代碼這個確切的方式將取決於2.js究竟是如何設置。這只是爲了說明,關鍵線路

g.Game = Game; 

我們打開一個小蟲洞讓遊戲能逃脫自我執行的匿名函數關閉它的縮影宇宙。

+0

謝謝,它的工作原理。但我的想法是在一個單獨的模塊中共享代碼。我怎樣才能從所需的模塊嚴格創建一個對象?我的意思是所有的類和函數都在模塊中,但我只是在主應用程序中實例化它們。我認爲它是我理解模塊和出口的一個問題 – vspr

+0

http://www.amazon.com/JavaScript-The-Good-Parts-ebook/dp/B0026OR2ZY/ref=sr_1_2?ie=UTF8&qid=1348574076&sr=8-2&keywords =的JavaScript +的+良好+份 – Geuis