this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
这里调用方法f1的是window对象,也就是说this指向window对象,所以会出现this.user 为undefined
这里调用方法f1的是对象a,就是说this指向a对象,所以this.user为a对象里面的“二狗子” 接下来朝深处看看
这段代码跟例2 比就是多了个window. 结果还是一样的,想说明什么问题呢,看下段代码
结果变成“大傻子”了,对比两段代码再结合最上面说的this指向调用它的对象,也就表名第一段代码是对象a调用的方法f1,第二段代码是对象b调用的,得出结论:在这种链式情况下,this指向的是它上一级的对象。可能表达的不太准确,反正就是那个意思。
再把b对象里面的user注释掉看看
这里的this应该是指向b对象的,但是b里面没有user啊,肯定就是undefined,通过this就把指代的对象给定死了,反正this就是指的b,我不管你里面有没有这个user,没有就返回undefined,我可不会去拿a的user,千万别与链式作用域搞混了,像下面这样
睁大眼看清楚了,这里没有this啊,所以执行f1的时候直接就是f1里面的user “二狗子”,执行f2的时候因为f2里面没有user,所以就朝外找,找到了外面的user “大傻子”。
不能再多说了,待会该迷糊了。再加个例子吧
其实就是new 关键字可以改变this的指向,通过new关键字,把一个对象实例给了a,同时this的指向也变成了a对象
还想说的一点就是,看博客或者看其他东西不要太跟着博主的思路,首先不敢保证他说的就完全正确,毕竟那也只是基于他的理解,除非这个人就是权威;其次,有时候太跟着博主的思路走,容易把你给陷进去,因为你总是不由自主的想要往要往博主的思路上靠,其实你是在按照别人的思路在思考,有时候可能就把你自己的想法给湮没掉了,说不定你的想法更加简单,更加深刻。
New关键字实例化过程
创建一个空对象。
伪代码:let obj={ }
将该对象的__proto__
指向类的原型对象。
伪代码:obj.__proto__=A.prototype
绑定该函数内部的this,指向这个对象。
伪代码:this=obj
执行函数,并且将this作为返回值返回。
伪代码:/执行代码/ ; retrun this
参考博客:https://www.cnblogs.com/pssp/p/5216085.html
http://www.ruanyifeng.com/blog/2018/06/javascript-this.html