2016-11-15 59 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所建议的那样,您可以直接在原型上创建单个函数,保留一组函数名称,遍历它并调用函数。或者,您可以在上下文中传递。 –