Я пытаюсь сгруппировать функции в javascript, хотя мне трудно понять, как отслеживать группы. В приведенном ниже примере мой вопрос: как «some.get('anotherContent')» знает, что он запрошен под псевдонимом «anotherSomeSome», а не «anotherSome». Я имею в виду, как отслеживать различные псевдонимы в этой модели? Ниже приведено то, что я пробовал, но мне кажется, что это довольно сложно и трудно отслеживать псевдонимы:
class someClass {
alias(callback) {
callback();
return this;
}
get(content) {
return 'some' + content;
}
}
const some = new someClass();
some.alias('some', () => {
some.alias('anotherSome', () => {
some.get('content')
})
some.get('contents')
some.alias('anotherSomeSome', () {
some.get('anotherContent')
})
})
Ваша функция some.alias() определена как принимающая один параметр, но ваш код передает ей два параметра.
почему ты используешь классы?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На первый взгляд это похоже на проблему XY... В любом случае.
Простым подходом было бы детализация аргументов: таким образом, вы передаете свой псевдоним в стек вместе с аргументами.
Если ваш код синхронизирован, вы можете сохранить свой псевдоним в свойстве класса. В моем случае я сохраняю его в массиве path, чтобы можно было отслеживать весь стек.
class someClass {
path = [];
alias(alias, callback) {
this.path.push(alias);
callback();
this.path.pop();
return this;
}
get(content) {
console.info(this.path.join(' / '), 'some' + content);
}
}
const some = new someClass();
some.alias('some', () => {
some.alias('anotherSome', () => {
some.get('content')
})
some.get('contents')
some.alias('anotherSomeSome', () => {
some.get('anotherContent')
})
})Как только вы вводите асинхронный (и, возможно, более сложный) код, вам необходимо отслеживать свои вызовы.
Мне кажется интересным использовать прокси, который возвращает экземпляр some с индивидуальным путем:
class someClass {
path = [];
alias(alias, callback) {
callback(new Proxy(this, {
get(self, prop){
if (prop === 'path'){
return [...self.path, alias];
}
return Reflect.get(...arguments);
}
}));
return this;
}
get(content) {
console.info(this.path.join(' / '), 'some' + content);
}
}
const some = new someClass();
some.alias('some', some => {
some.alias('anotherSome', some => {
some.get('content')
})
some.get('contents')
some.alias('anotherSomeSome', some => {
some.get('anotherContent')
})
})Это действительно очень интересно. Не знал, что можно перехватить через прокси. Спасибо большое
Принимает ли
aliasодин параметр или два? И какой цели вы хотите, чтобы это служило?