2016-11-15 54 views
0

我有一個構造函數,並試圖在其原型中有一個函數數組,但我需要的函數有構造函數創建的對象的範圍,而不是數組的作用域。 我試過使用.bind(this)或.bind(_p),但「this」是節點服務器的作用域,_p只是沒有變量的原型。函數內部數組忽略數組的範圍

function BoardModel() { 
    this.x = 3 
    this.y = 2 
} 

_p = BoardModel.prototype; 

_p.skillFunctions = [ 
    function(){ 
     console.log(this.x); //undefined 
    }, 
    function(){ 
     console.log(this.y); //undefined 
    }, 
]; 
+0

如果您想要將這些函數用於通過構造函數創建的任何對象,那麼爲什麼不只是將對象引用傳遞給它們呢? – Azamantes

+0

你的意思是每當我調用任何函數來傳遞對象作爲參數?這是可能的,我猜,希望有一個更自然的解決方案。 – Fuseques

+1

©Maayan Blum您可以像其他任何方法一樣將這些函數添加到原型中,並在原型(或創建的對象,如果需要定製)上擁有一個包含要調用的函數名稱數組的屬性。然後你只需迭代數組並調用方法,如'this [methodName]();' – Azamantes

回答

0

爲什麼不爲每個屬性使用自己的方法而不是數組?所以這個怎麼樣(雙關語意)

function BoardModel() { 
 
    this.x = 3 
 
    this.y = 2 
 
} 
 

 
_p = BoardModel.prototype; 
 

 
_p.skillFunctionsX = function(){ 
 
    console.log(this.x); 
 
}; 
 

 
_p.skillFunctionsY = function(){ 
 
    console.log(this.y); 
 
}; 
 

 
var item = new BoardModel; 
 
item.skillFunctionsX(); 
 
item.skillFunctionsY();

+0

我需要能夠通過索引來調用它們。 – Fuseques

0

箭功能使用從封閉範圍內?

function BoardModel() { 
    this.x = 3 
    this.y = 2 

    this.skillFunctions = [ 
     () => { console.log(this.x) }, 
     () => { console.log(this.y) }, 
    ]; 
} 

let board = new BoardModel() 

board.skillFunctions.forEach((skillFunction) => { skillFunction() }) 
+0

這樣,每次構造函數被調用時都會創建函數。我嘗試使用_p.skillFunctions []中的箭頭函數,但範圍仍然是數組的範圍。 – Fuseques

+0

@MaayanBlum嗯,是的,數組中的箭頭函數將「this」設置爲封閉上下文,在我們的例子中,這將是全局對象(或者在嚴格模式下未定義)。你無法完全按照你想象的方式去做你想象中的事情。但是,如Nina所建議的那樣,您可以直接在原型上創建單個函數,保留一組函數名稱,遍歷它並調用函數。或者,您可以在上下文中傳遞。 –