《Learning JavaScript Design Patterns》原型链中的this值问题?

新手上路,请多包涵

这本书里面工厂模式的代码如下
QQ图片20191220120444.png
执行carFactory.createVehicle()时调用VehicleFactory.prototype.createVehicle()函数,此时this的值是VehicleFactory

但是,执行下面的代码时,
QQ图片20191220120450.png
使用原型链继承后,同样执行VehicleFactory.prototype.createVehicle()函数,为什么此时this的值是TruckFactory?

请问这是什么机理?

阅读 2.8k
3 个回答

JS对象设置新属性机制是:原型中有则覆盖,无则创建。都是基于当前实例中的this

this的值不是根据函数创建的时候指定的,而是与运行时环境有关的,它指向的是调用函数的对象。

这里createVehicle()两次分别被carFactory和truckFactory两个不同的对象调用,两次调用分别指向他们。

var obj = {
    test: function() {
        console.log(this)
     }
 }

obj.test() // test函数被obj调用,this指向obj对象
var mytest = obj.test
mytest() // mytest被全局对象调用,相当于window.mytest(), this指向全局window对象,

一般来讲:

  1. 函数普通调用(如mytest()),匿名函数执行,this指向全局对象。
  2. 函数作为对象方法调用(比如obj.test()),this指向该对象。
  3. 构造函数中的this指向新创建的实例。

普通函数this谁调用指向谁,object.func()指定func的调用者为object,则this指向object。
非严格模式下没有指定调用者this指向全局对象(浏览器环境window,Node环境global);
严格模式下没有指定调用者this为undefined.

关于this:http://wintc.top/article/28

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