Javascript 使用“apply”或“call”;旧的;上下文

Javascript 使用“apply”或“call”;旧的;上下文,javascript,Javascript,我只想在对象b中使用apply和on函数fn,但在“旧”上下文中,我的意思是在这种情况下使用类A编辑对象的上下文 如果要使用ex\u array作为参数数组,以便apply将迭代这些参数,请执行以下操作(): 先前的答复 见此: 基本上,您所需要做的就是将this.a_fn与其当前上下文绑定。诀窍是在将其设置为this.b_fn时使用.bind(null,/*args*/),因此它保留原始A上下文,但允许您传递另一个参数(在本例中,['A',b']编辑 如果要使用ex\u array作为参数数组

我只想在对象
b
中使用
apply
和on函数
fn
,但在“旧”上下文中,我的意思是在这种情况下使用类
A

编辑对象的上下文 如果要使用
ex\u array
作为参数数组,以便
apply
将迭代这些参数,请执行以下操作():

先前的答复 见此:

基本上,您所需要做的就是将this.a_fn与其当前上下文绑定。诀窍是在将其设置为this.b_fn时使用
.bind(null,/*args*/)
,因此它保留原始
A
上下文,但允许您传递另一个参数(在本例中,
['A',b']

编辑 如果要使用
ex\u array
作为参数数组,以便
apply
将迭代这些参数,请执行以下操作():

先前的答复 见此:


基本上,您需要做的就是将
this.a\fn
与其当前上下文绑定。诀窍是在使其
this.b\u fn
时使用
.bind(null,/*args*/)
,因此它保留原始
a
上下文,但允许您传递另一个参数(在本例中,
['a',b']

这里有一个解决方案,
a\u fn
不预先绑定到参数数组。我添加了一些日志作为演示:

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();

这里有一个解决方案,
a_fn
不预先绑定到参数数组。我添加了一些日志作为演示:

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();


这可能是一个很好的答案,但我需要升级我的示例,因为在类
A
@JoshBeam中没有设置参数,我惊讶地发现调用
fn.bind(null,…)
,当
fn
已绑定时,在先前绑定的上下文中调用该函数。我找不到有关此的任何引用。@robertklep,是的,我怪JavaScript有这种特性;)我猜当
Function.prototype.bind
null
视为上下文时,它默认返回到以前的上下文,而不是尝试设置新的上下文。@JoshBeam是的,这也是我的猜测:-)顺便说一句,
ex_array
是指一个参数数组,而不是单个参数。所以,
.apply()
必须在某个地方被调用。@robertklep,是的,这很有意义。我更新了我的答案。在这种情况下,您只需返回一个调用
apply
的函数即可。同样有效。这可能是一个很好的答案,但我需要升级我的示例,因为在类
A
@JoshBeam中没有设置参数,我惊讶地发现调用
fn.bind(null,…)
,当
fn
已绑定时,调用先前绑定上下文中的函数。我找不到任何关于这方面的参考资料。@robertklep,是的,我怪JavaScript有这种特殊性;)我猜当
Function.prototype.bind
null
视为上下文时,它默认返回到以前的上下文,而不是尝试设置新的上下文。@JoshBeam是的,这也是我的猜测:-)顺便说一句,
ex_array
是指一个参数数组,而不是单个参数。所以,
.apply()
必须在某个地方被调用。@robertklep,是的,这很有意义。我更新了我的答案。在这种情况下,您只需返回一个调用
apply
的函数即可。同样有效。这可能是一个很好的答案,但我需要升级我的示例,因为在类
A
@JoshBeam中没有设置参数,我惊讶地发现调用
fn.bind(null,…)
,当
fn
已绑定时,调用先前绑定上下文中的函数。我找不到任何关于这方面的参考资料。@robertklep,是的,我怪JavaScript有这种特殊性;)我猜当
Function.prototype.bind
null
视为上下文时,它默认返回到以前的上下文,而不是尝试设置新的上下文。@JoshBeam是的,这也是我的猜测:-)顺便说一句,
ex_array
是指一个参数数组,而不是单个参数。所以,
.apply()
必须在某个地方被调用。@robertklep,是的,这很有意义。我更新了我的答案。在这种情况下,您只需返回一个调用
apply
的函数即可。同样有效。我根据您的更改更新了我的答案。在我看来,B是从A继承的。为什么不将A的原型扩展到B?我根据您的更改更新了我的答案。在我看来,B是从A继承的。为什么不将A的原型扩展到B?我根据您的更改更新了我的答案。在我看来,B是继承自A。为什么不将A的原型扩展到B?
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();
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();
};