在构造函数内调用另一构造函数的call方法作用是什么?this指向如何?
解答
1. Car.call(this, location)的作用验证
你的猜测是正确的,这行代码的核心作用就是让Van的实例继承Car构造函数中定义的loc实例属性,属于ES5阶段实现类继承的经典手段「构造函数窃取」:不需要重复在Van里写this.loc = location这类相同的初始化逻辑,直接复用父构造函数Car的逻辑即可。
注意当前代码只完成了实例属性的继承,Car原型上挂载的move方法还不能被Van实例调用,如果要实现完整继承,还需要补充两行代码:
// 让Van的原型对象继承Car的原型对象 Van.prototype = Object.create(Car.prototype) // 修正Van原型的constructor指向,避免后续类型判断出错 Van.prototype.constructor = Van
补充后你就可以正常调用Van实例的move方法了:
const myVan = new Van(2) myVan.move() console.log(myVan.loc) // 输出3
2. 两处this的指向说明
Car.call(this, location)中的this
这行代码定义在Van构造函数内部,当你通过new Van(xxx)的方式创建Van实例时,Van构造函数内部的this默认指向刚刚创建出来的Van实例对象,这里把它作为call方法的第一个参数传入,目的就是将Car构造函数的执行上下文绑定到这个Van实例上。- Car构造函数内部
this.loc = location中的this
构造函数的this指向由它的调用方式决定:- 如果是通过
Car.call(xxx)调用,this就指向你传入的第一个参数也就是上面的Van实例 - 如果是直接通过
new Car(xxx)创建Car实例,this就指向当前创建的Car实例对象
- 如果是通过
内容的提问来源于stack exchange,提问作者Letscode
相关产品推荐
相关产品推荐

