Как я могу вызвать любую функцию в цепочке функций без цепочки?

#javascript #function #object #literals #chain

#javascript #функция #объект #литералы #цепочка

Вопрос:

Извините, если мой вопрос был недостаточно ясен. Я помещу свой код здесь…

 var chain = {
    'fn_1' : {
             //fn_1 code here
             chain.fn_2();},
    'fn_2' : {
             //fn_2 code here
             chain.fn_3();}

...and so on
}
  

Допустим, если я хочу вызвать chain.fn_1 (), есть ли способ, которым я могу это сделать, не вызывая chain.fn_2 ()?

Что я могу придумать прямо сейчас, так это флаг, но это было бы много лишних флагов, вероятно, для каждой функции. У вас, ребята, есть какие-нибудь идеи?

Ответ №1:

Если каждая серия функций вызывает следующую, вы правы, вам нужно будет иметь какой-то флаг. По всей вероятности, лучше всего было бы модифицировать ваши функции так, чтобы они возвращали ссылку на объект. Тогда вы могли бы создать цепочку следующим образом:

 var chain = {
  'fn_1': function () {
    // do something here.
    return this;
  },
  'fn_2': function () {
    // do something here.
    return this;
  },
  'fn_3': function () {
    // do something here.
    return this;
  }
};

// call the full chain:
chain.fn_1().fn_2().fn_3();

// call only the middle.
chain.fn_2();
  

Ответ №2:

ответ g.d.d.c является лучшим, но если вы по какой-либо причине не можете изменить объект, вы могли бы сделать это:

 var _oldFn2 = chain.fn_2
chain.fn_2 = function() { return; };
chain.fn_1();
chain.fn_2 = _oldFn2;
  

Ответ №3:

 var chain = {
    fn : ['fn1', 'fn2', 'fn3'],
    call : function(name) {
       var i = 0, pos = -1, l = this.fn.length;
        for(i = 0; i < l; i  = 1) {
            if(this.fn[i] == name) {
                pos = i;
            }
            if(pos !== -1) {
                this[this.fn[i]]();             
            }
        }

    },
    fn1 : function() {
        alert('fn1');
    },
    fn2 : function() {
        alert('fn2');
    },
};
chain.call('fn1'); //chain
chain.fn1(); //single
  

Комментарии:

1. у меня нет объекта для возврата, поэтому sn g.d.d.c не настолько применим. но для функций, которые имеют, я обязательно использую это!