#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 не настолько применим. но для функций, которые имеют, я обязательно использую это!