请看一下下面这段代码
`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是函数指向它的原型对象的
如果对这一块知识有疑问,请参考
分析上面的代码,
- 当new fun9时创建一个对象,对象里面有两个属性,一个是a=0,一个是all方法
- 当调用x.all方法时,输出this.a
- 此时需要寻找all函数的this指向,是x调用了all函数,所以all的this指向x对象
- x对象里面有a属性,输出a=0
- 如果我们将fun9里面的a去掉,将会输出a=8???为什么,this怎么又和原型链混淆了
- 别忘了x是什么,是一个对象,当找x里面的a属性的时候,找不到,去哪里找,当然是fun9.prototype里面
- 所以找到了a=8
- 如果fun9.prototype里面也没有a属性,就会找到object对象
总结:
this是对于函数来说的,指向一个对象。 对象没有this的概念,只有原型链,在对象里面找不到属性就往原型链里面找。 this里面的变量和对象里面的属性其实是一个东西,因为this指向的就是对象。
有不同理解欢迎指正