什么是js原型链,它有多重要?
按照我这18步思路,一条一条去理解,很简单!有问题写到评论区!!
- 除了箭头函数,不论js内置函数还是声明的函数,一切函数都是构造函数。
- 一切对象都是通过某一个构造函数创造而来;只不过有时候是程序员主动用new创造,有时是js引擎自动用new创造。
- 又因为一切函数都是对象。
- 所以一切函数也都是通过Function这个特殊函数构造而来。
- 同时包括Function这个函数它自己,也是通过它自己Function这个函数构造而来。
- 所有构造函数都有prototype属性并指向一个对象。
- 构造函数创造出的对象,默认有一个隐形属性[[prototype]],并与这个构造函数的prototype属性指向的同一个对象。
- 而如果通过Object.creact()创建对象,还可以自定义[[prototype]]属性指向哪个对象。
- 可想而知,任何对象都有[[prototype]]属性,并指向另一个对象,这个对象被称为其原型对象。
- 获取任何一个对象的某个属性值,如果对象中没有该属性,就会顺着隐藏属性[[prototype]]找到其指向的原型对象,从中再找该属性。如果还找不到,会以次类推向上找,最终必然能找到Object.prototype这个对象。
- 顺着每个对象隐藏属性[[prototype]]向上找,直到找到Object.prototype这个对象,这个查找的路径就是原型链。
- 切记Object.prototype只不过是一个对象的名字,代表着构造函数Object是对象,同时有一个prototype属性,该属性默认指向了一个JS引擎自带且一个非常强大的对象。
- Object.prototype指向的这个强大对象,就是是原型链的源头对象。
- 这个原型链的源头对象内置非常多的属性,很多属性又指向具备强大功能的内置函数。
- 那么所有的对象,都可以顺着原型链找到并调用Object.prototype中属性指向的函数,从而实现强大功能。
- 比如程序员执行obj.toString(),就是通过obj这个普通对象,顺着原型链找到Object.prototype中的toString属性,该属性指向一个函数。obj.toString()就是调用该函数。
- 执行obj.toString()的原理是把obj指向的对象作为this的指向,执行toString函数,在toString函数中将this指向的对象转换成字符串,并返回该字符串,从而达到了我们想要的效果。
- 整个javascript语言体系就是这样构建起来的。
送给大家一张网上找的原型图,感谢画图的前辈!
图中的__proto__本身不是js语言自带的属性,但是因为[[prototype]]属性是隐形的,所以很多浏览器包括nodejs,都会自动给对象显性的加一个__proto__属性,与[[prototype]]属性指向同一个对象,即:原型对象。