JavaScript的.call()方法理解

今天在理解.call()方法上出现了问题,自己给自己讲不明白了...

var obj = {
    name: 'linxin'
}

function func() {
    console.log(this.name);
}

func.call(obj);       // linxin

问题一 : A.call(B),可以理解为A继承了B吗?
要是可以的话,
问题二 :下边这个怎么变成了B继承A了呢?

var Person1  = function () {
    this.name = 'linxin';
}
var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    Person1.call(this);
}
var person = new Person2();
person.getname();       // linxin

.call()的A和B要怎么理解 ? 怎么来形容比较好理解一些...现在看的有点脑溢血

阅读 2.2k
3 个回答

不要这样理解,call 跟继承没有关系。

最简单的理解,func.call() 仅仅就是"指定了在函数 func 内部 this 的值是多少"并执行 func。

上面的两段代码:

function func () {
  console.log(this.name)
}

var obj = { name: 'linxin' }
func.call(obj) // 执行 func,并且 func 里用到 this 的地方,this 的值是 obj

可能第二段代码里的变量命名让你觉得有点继承的感觉,我把它改写一下你再看看:

function 取名 () {
    this.name = 'linxin';
}
var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    取名.call(this);
}
var person = new Person2();
person.getname();       // linxin

希望对你有帮助

很好理解,.call() 方法是改变函数内部的 this 指向,在 Person2 中调用 Person1 时,把 Person1 内部的 this 指向修改为 Person2 的 this 了。构造继承。

call和apply的区别是传递参数的方式不一样,但作用都是为要执行的方法重新绑定一个this,类似用B来调用A的方法。

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