2015-06-17 2 views
1
B = function(fn) { 

    var ex_array = ['a', 'b']; 

    this.b_fn = function() { 
     fn.apply(what_should_be_there, ex_array); 
    } 

} 

A = function() { 

    this.a_fn = function (a, b) { 
     //do sth 
    } 

    var b = new B(fn); 

} 

Только то, что я хотел бы сделать, это использовать apply с функцией вклом fn в объекте b, но с «старым» контекстом, я имею в виду в данном случае с контекстом объекта класс AИспользование применять или коллировать с «старым» контекстом

+0

Я обновил свой ответ на основе ваших изменений – taxicala

+0

Он смотрит на меня как B наследуется от А. Почему не только расширить прототип в в в –

ответ

0

Редактировать

Если вы хотите использовать ex_array как массив аргументов, так что apply будет перебирать их, сделать это (jsfiddle):

B = function(fn) { 

    var ex_array = ['a', 'b']; 

    this.b_fn = function() { 
     return fn.apply(null, ex_array); 
    }; 

} 

A = function() { 

    this.a_fn = function (a, b) { 
     console.log(this, a, b); 
    } 

    var b = new B(this.a_fn.bind(this)); 

    b.b_fn(); // => A {}, "a", "b" 

} 

new A(); 

Предыдущий ответ

Смотреть это working demo on jsfiddle:

B = function(fn) { 

    var ex_array = ['a', 'b']; 

    this.b_fn = fn.bind(null, ex_array); 

} 

A = function() { 

    this.a_fn = function (a, b) { 
     console.log(this, a); 
    } 

    var b = new B(this.a_fn.bind(this)); 

    b.b_fn(); // => A {}, ['a', 'b']; 

} 

new A(); 

В принципе, все, что вам нужно сделать, это связать this.a_fn с текущим контекстом. Хитрость заключается в том, чтобы использовать .bind(null, /* args */), делая его this.b_fn, поэтому он сохраняет оригинальный A контекст, но позволяет передавать в другой параметр (в данном случае, ['a', 'b'].

+0

Он мог.? быть хорошим ответом, но мне нужно обновить свой пример, потому что аргументы не заданы в классе 'A' – kspacja

+0

Это было изм. – kspacja

+0

@kspacja, обновил мой ответ. –

0

Вот решение, где a_fn не prebound к аргументам . массив я добавил журналирование как демо:

var B = function(fn) { 
    var ex_array = [ 'a', 'b' ]; 
    this.b_fn = function() { 
    fn(ex_array); 
    }; 
}; 

var A = function() { 
    this.c = 'hello world'; 
    this.a_fn = function(a, b) { 
    console.log('a:', a); 
    console.log('b:', b); 
    console.log('c:', this.c); 
    }; 
    var b = new B(Function.prototype.apply.bind(this.a_fn, this)); 
    b.b_fn(); 
};