2016-11-15 3 views
0

У меня есть конструктор и я пытаюсь иметь массив функций внутри своего прототипа, но мне нужны функции, чтобы обладать областью объекта, созданной конструктором, а не областью массива , Я попытался использовать .bind (это) или .bind (_p), но «это» - область узла узла, а _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 Ну, да, функции стрелок в массиве будут иметь «это» для окружения, который будет глобальным объектом (или неопределенным в строгом режиме) в нашем примере. Вы не можете делать то, что вы себе представляете, точно так, как вы себе представляли. Однако вы могли бы создать отдельные функции непосредственно на прототипе, как предложила Нина, сохранить массив имен функций, перебрать его и вызвать функции. В качестве альтернативы вы можете перейти в контекст. –

Смежные вопросы