Это довольно сложно объяснить. Прошу прощения за надуманный пример.
Я хочу получить доступ к двум разным областям (глобальным классам и локальным объектам) в одной и той же функции. Указанная функция является объектом-методом.
Я использую babel-preset-react-native
, который должен быть ES6 (https://facebook.github.io/react-native/docs/javascript-environment.html).
С учетом следующего примера класса:
class Logic {
constructor() {
this.keys = ['Red Key', 'Blue Key'];
}
hasKey = (searchKey) => {
return this.keys.includes(searchKey);
}
allowedToEnter = {
redHouse: () => {
// some logic
return true;
},
// ...
};
houses = [
{
name: 'Red House',
isAccessible: () => {
return this.hasKey('Red Key');
},
shouldAccess__Global: () => {
return /* wrong scope */this.isAccessible() && this.allowedToEnter.redHouse();
},
shouldAccess__Local: function () {
return this.isAccessible() && /* wrong scope */this.allowedToEnter.redHouse();
},
},
// ...
];
}
let logic = new Logic();
console.log(logic.houses[0].shouldAccess__Global());
// returns: isAccessible is not a function
console.log(logic.houses[0].shouldAccess__Local());
// returns: Cannot read property 'redHouse' of undefined
Определение функции стрелки связывает область видимости класса с this
. Используя классический синтаксис функции, он связывает this
с областью действия своего «владельца», домашнего объекта внутри массива. Я понимаю, что в обоих случаях это правильное поведение.
Существует ли элегантный способ написания метода shouldAccess
, дающий доступ к обеим областям?
Возможное решение, которое я придумал, следующее:
shouldAccess__withHelper: function () {
return this.isAccessible() && this.helper().allowedToEnter.redHouse();
},
helper: () => {
return this;
},
Это не элегантная мысль. У меня есть большое количество домашних объектов в моем массиве. Предоставление каждому объекту вспомогательной функции - отстой.
Я знаю, что вся структура данных немного запутанная и не идеальная. Я не прошу совета о том, как лучше структурировать мой код.
Я работаю с большим количеством логики в данной структуре, и рефакторинг всего будет огромной болью.