这几天一直在讲面试题,其中有一个题是这样的,“new操作符做了些啥?”
这个题目是问你生成一个对象的实例的过程,那么常规回答就是这样:
3.将对象作为函数的this传进去,如果return 出来东西是对象的话就直接返回 return 的内容,没有的话就返回创建的这个对象。
按说这个题目讲到这里也就可以结束了,但我的课程一向是以“引申”的方式来讲解的,既然已经提到 __proto__了,那么必须讲一下它和prototype的关系。
其实说来也很简单,在js中函数都有prototype,它指向一个对象,这个对象中包含constructor,它指向的是它所在的prototype所在的那个函数。
这个说法是我自己的理解,并不是书上或是网上哪些的定义,但应该是没有错的。而且我讲课基本上很少照着念定义,画个示意图吧,毕竟上面那段话还是有点绕的,
就是这样如上图所示,
接下来看由这个构造器所生成的实例,
可以看到,这个实例没有prototype,自然也就不会有什么constructor了
那么如果我想看到这个实例的构造器该怎么办呢?这时就该 __proto__上场了,
这张截图包含的信息比较多,
(1)、实例没有prototype;
(2)、实例的__proto__却可以直接访问生成这个实例的构造器;
(3)、通过“实例.__proto__.constructor”也可以看到输出的结果就是构造器;
(4)、最重要就是“实例的__proto__和构造器的prototype的指向”,是相等的。
说到这里,可以确定的说,__proto__就是用来获得实例的构造器的。因为不管网上其它的各种资料说的多么详细、多么复杂或是天花乱坠,其实上面的那几张截图已经说明了事实。
同学们,关于这个知识点,我的心得就是,“讲课这东西真的就是越讲越好,至少在__proto__这里,我对它的理解比上一期讲到这里时更深刻了。也就是说,不管你懂没懂,我反正是懂了。”
那么,你到底是懂还是没懂呢?