人有两个宝,双手和大脑。双手会吃饭,大脑会思考,会宕机,会重启,还会需要常常更新维护。我的脑子就像接触不良的电路,又好像常常断触的屏幕。回路不一定闭合哈,常常卡壳。关于构造函数原型一类的知识,应该是每个前端的基本功。在我脑子里,学的时候会七八成,现在就剩两成不到了。概念又不太清晰了,就常复习巩固,走走回头路。上链接:帮你彻底搞懂JS中的prototype、__proto__与constructor(图解) 。 看完后,感觉自己又懂了七八成了。
函数都天然拥有prototype 属性。并且是函数独享的属性。有且只有函数拥有。
对象都天然拥有__proto__ 属性。
函数是对象。
所以函数既有prototype 属性,也有__proto__ 属性。
一个new出来的实例是个对象,所以这个实例f1,是有__proto__ 属性的。
这个实例和它的构造函数的关系:
f1.__proto__ === Foo.prototype 。
当访问对象f1的某个属性时候,如果这个对象自己没有,就去它的构造函数原型上去访问。因为构造函数原型是用来存放它new出来的对象实例们的公用属性和方法。 这时候需要一个桥梁指向原型,也就是f1对象的__proto__属性了。
通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
补充:关于constructor
constructor 也是对象天然拥有的属性,它是从一个对象指向一个函数,含义就是指向该对象的构造函数。每个对象都有构造函数(本身拥有或继承而来),函数是对象,当然也会拥有constructor属性,指向构造当前构造函数的构造函数。
new 出来的实例对象的constructor 都是指向实例的构造函数本身。
更多的已不想知道了,又抽象又混乱的。俄罗斯套娃和递归都不是我喜欢的。