困惑我好久的this与原型链

55 阅读1分钟

请看一下下面这段代码

`function fun9() {
    this.a = 0
    this.all = function () {
        console.log(this.a, 'fun9')
    }

}
fun9.prototype.all = function () {
    console.log(this.a, 'fun9.prototype')
}
fun9.prototype.a = 8
const x = new fun9()
x.all()`

在函数fun9内定义了变量a和函数all,然后在fun9的prototype上定义了同样的属性和方法

首先明确一下知识点

  • proto 针对的是对象
  • prototype,this针对的是函数,但是函数也是对象,所以函数也有__proto__
  • this指向的是函数的可访问空间,这个可访问空间是一个对象,对象里面有方法和属性
  • __proto__是隐式原型,指向对象的构造函数的显式原型
  • prototype是函数指向它的原型对象的

如果对这一块知识有疑问,请参考

分析上面的代码,

  1. 当new fun9时创建一个对象,对象里面有两个属性,一个是a=0,一个是all方法
  2. 当调用x.all方法时,输出this.a
  3. 此时需要寻找all函数的this指向,是x调用了all函数,所以all的this指向x对象
  4. x对象里面有a属性,输出a=0
  5. 如果我们将fun9里面的a去掉,将会输出a=8???为什么,this怎么又和原型链混淆了
  6. 别忘了x是什么,是一个对象,当找x里面的a属性的时候,找不到,去哪里找,当然是fun9.prototype里面
  7. 所以找到了a=8
  8. 如果fun9.prototype里面也没有a属性,就会找到object对象

总结:

this是对于函数来说的,指向一个对象。 对象没有this的概念,只有原型链,在对象里面找不到属性就往原型链里面找。 this里面的变量对象里面的属性其实是一个东西,因为this指向的就是对象。

有不同理解欢迎指正