2013-02-25 118 views
1

我有一個像下面如何從對象函數返回一個對象 - javascript?

function obj() { 

    this.cellSize = 50; 

    this.createBlock = function() { // creates a block object 
     this.x = 0; 
     this.y = 0 - (this.cellSize * 1.5); 
     this.baseVelocity = 1; 
     this.velocity = this.baseVelocity; 
     return this; 
    }; 

    this.activeBlock = this.createBlock(); // active block object 

    this.nextBlock = this.createBlock(); // next block object 
} 

對象當我檢查obj.activeBlock我沒有得到應該從obj.createBlock返回的對象?

感謝,

+1

您是否在使用'new'關鍵字? 'var a = new obj();的console.log(a.activeBlock);'。 – dfsq 2013-02-25 06:06:50

+0

是的,我只是'obj.activeBlock'和'obj'一樣,而不是'createBlock'中概述的對象。 – ShaShads 2013-02-25 06:10:26

+0

*「當我檢查'obj.activeBlock' ... * *似乎你在猜測JavaScript是如何工作的。 – 2013-02-25 06:11:23

回答

2

你可能想是這樣的:

function obj() { 
    var that = this; 
    this.cellSize = 50; 

    this.createBlock = function() { // creates a block object 
     this.x = 0; 
     this.y = 0 - (that.cellSize * 1.5); 
     this.baseVelocity = 1; 
     this.velocity = this.baseVelocity; 
     return this; 
    }; 

    this.activeBlock = new this.createBlock(); // active block object 

    this.nextBlock = new this.createBlock(); // next block object 
} 

thiscreateBlock功能應該從obj()this不同。您還需要爲每個塊使用new創建一個新對象。如果cellSize應該是一個常量,則可以將代碼重寫爲閉包:

function obj() { 
    var cellSize = 50; 

    this.createBlock = function() { // creates a block object 
     this.x = 0; 
     this.y = 0 - (cellSize * 1.5); 
     this.baseVelocity = 1; 
     this.velocity = this.baseVelocity; 
     return this; 
    }; 

    this.activeBlock = new this.createBlock(); // active block object 

    this.nextBlock = new this.createBlock(); // next block object 
} 
+0

謝謝你正是我出錯的地方,謝謝關閉提示:) – ShaShads 2013-02-25 06:13:46

+0

@TedHopp:如果OP做到了,那麼函數將不再能夠訪問正在使用的變量作用域。由於'.createBlock'作爲構造函數被調用,因此它也無法訪問它被調用的對象的任何屬性。 – 2013-02-25 06:19:52

+0

@thesystem - 是的,我剛剛意識到這一點。最好的將是一個工廠函數而不是構造函數。刪除評論。 – 2013-02-25 06:21:22