this绑定

function foo(something) {
    this.a = something;
}
var obj1 = {foo: foo};
var obj2 = {};
obj1.foo( 2 );
console.log( obj1.a ); // 2
obj1.foo.call(obj2,3);
console.log( obj2.a ); // 3
//在下列代码中,隐式绑定obj1.foo和new绑定同时出现。最终obj1.a结果是2,而bar.a结果是4,说明this被绑定在bar上
var bar = new obj1.foo( 4 );
console.log( obj1.a ); // 2    ?这个时候为什么不是4,而是2
console.log( bar.a ); // 4
阅读 1.5k
2 个回答
//在下列代码中,隐式绑定obj1.foo和new绑定同时出现。最终obj1.a结果是2,而bar.a结果是4,说明this被绑定在bar上

javascript 里,普通调用函数,跟用 new 调用构造函数,使用的是两种不同 this 绑定的策略。

这里是用 new 构造,所以使用 new 调用构造函数的策略,与“隐式绑定”无关。

使用 new 调用构造函数的时候,this 是绑定到一个新对象上的。在这个 script 里,就是最后返回并赋值给了 bar 的对象,与 obj1 无关。所以 obj1.a 并没有变化。

var bar = new obj1.foo(4)只是将 obj1.foo 作为构造函数,实例化了一个新的对象并赋值给了 bar,此时的 bar 就是 {a: 4},而对原本的 obj1 这个对象没有任何影响。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题