Концепция, с которой вы боретесь - это значение this
, когда вы вызываете / размещаете свои функции обратного вызова внутри массива.После этого this
становится array
, и, таким образом, вы не получите ожидаемый результат.Одним из способов получить этот результат может быть использование call
и преобразование вашего объекта, чтобы его можно было создать следующим образом:
var myObj = function() {
this.myValue = "My Callback function has been Called",
this.init = function() {
this.myFunctions[0].call(this) // <-- pass the proper `this`
this.myFunctions[1].call(this)
},
this.myCallback = function() {
console.log(this.myValue);
},
this.myCallback2 = function() {
console.log(this.myValue + " Second Callback");
},
this.myFunctions = [this.myCallback, this.myCallback2]
}
var createObject = new myObj()
createObject.init();
Другой способ был бы через bind
, но это вряд ли рекомендуется в наши дни, поэтому я бы пропустил его и направился к рекомендации, которую, я думаю, вы должны рассмотреть:
class MyObj {
constructor(val) {
this.myValue = val;
}
myCallback() {
console.log(this.myValue + " - First Callback");
}
myCallback2() {
console.log(this.myValue + " - Second Callback");
}
get myCallbacks() {
return ['myCallback', 'myCallback2']
}
init() {
this[this.myCallbacks[0]]() // <-- no issues with `this` anymore
this[this.myCallbacks[1]]()
}
}
var createObject = new MyObj('foo')
createObject.init();
Разместите ваш обратный вызов как string keys
в вашем массиве myCallbacks
в вашем классе.Таким образом, вы можете вызывать их через средство доступа к свойству и не беспокоиться о контексте this
, поскольку в данный момент это будет тот, который вы ожидаете - класс.