原型链是JS里一个重要的概念,理解原型链之前,我们要了解原型。
原型
mdn:
每个对象都有一个内部链接到另一个对象,称它为原型
这里的另一个对象就是JS为了将一些常用的方法共享,创建对象的时候,我们会把公共的方法和属性挂载到原型上,这样就不用重复创建同一种方法,占用内存,避免资源浪费。
给出一个图:
根据这个图给出几个结论:
-
prototype
: 每个函数都有一个prototype属性,是它自身的原型。
2._ proto _
: 每一个对象(包括函数创建的对象, 函数本身和原型对象)还有一个属性叫做 proto(它是一个对象) -
Object._protp_
为null
: 是原型的顶端
这些原型属性就把公共方法存在了里面,说白了就是为了:
- 简化代码
- 减少内存占用
原型链
当我们读取一个方法时,例如obj.toString
,JS引擎会做下面这些事:
JS 引擎会做下面的事情:
看看
obj
对象自身有没有toString
,没有就往下找。看到
obj._proto_
属性,在里面找找有没有toString
属性,发现obj._proto_
有 toString 属性,到这里找到了。
所以可以将 JS引擎在对象里沿着_ proto _
查找toString
的这条'路线'看成是一条原型链,_ proto _
可以将对象和对象连接起来。 如果 obj._proto_
没有,那么浏览器会继续查看obj._proto_._proto_
,直到找到 toString 或者_proto_
为 null
。
共享原型链
实际上_ proto _
在对象里存的是地址,所以当我们改写一个对象的_ proto _
属性里的方法时,另一个对象相应的方法也会变。
补充——hasOwnProperty
hasOwnProperty
是Object.prototype
的一个方法,它能判断一个属性是不是对象的私有属性而不是原型链上的属性
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
总结
- 所有对象都有一个
_ proto _
(除了原型的原型之外) - 原型链其实就是一个搜索的路径