JavaScript原型链—prototype chain


原型链是JS里一个重要的概念,理解原型链之前,我们要了解原型。


原型

mdn:
每个对象都有一个内部链接到另一个对象,称它为原型

这里的另一个对象就是JS为了将一些常用的方法共享,创建对象的时候,我们会把公共的方法和属性挂载到原型上,这样就不用重复创建同一种方法,占用内存,避免资源浪费。

给出一个图:

JavaScript原型链—prototype chain_第1张图片
prototype-lauout.jpg

根据这个图给出几个结论:

  1. prototype: 每个函数都有一个prototype属性,是它自身的原型。
    2._ proto _: 每一个对象(包括函数创建的对象, 函数本身和原型对象)还有一个属性叫做 proto(它是一个对象)
  2. Object._protp_null: 是原型的顶端

这些原型属性就把公共方法存在了里面,说白了就是为了:

  • 简化代码
  • 减少内存占用

原型链

当我们读取一个方法时,例如obj.toString,JS引擎会做下面这些事:
JS 引擎会做下面的事情:

  1. 看看 obj对象自身有没有toString ,没有就往下找。

  2. 看到 obj._proto_ 属性,在里面找找有没有 toString属性,发现 obj._proto_有 toString 属性,到这里找到了。

所以可以将 JS引擎在对象里沿着_ proto _查找toString的这条'路线'看成是一条原型链,_ proto _可以将对象和对象连接起来。 如果 obj._proto_没有,那么浏览器会继续查看obj._proto_._proto_,直到找到 toString 或者_proto_null

共享原型链

实际上_ proto _在对象里存的是地址,所以当我们改写一个对象的_ proto _属性里的方法时,另一个对象相应的方法也会变。


补充——hasOwnProperty

hasOwnPropertyObject.prototype的一个方法,它能判断一个属性是不是对象的私有属性而不是原型链上的属性

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true

总结

  • 所有对象都有一个_ proto _(除了原型的原型之外)
  • 原型链其实就是一个搜索的路径

你可能感兴趣的:(JavaScript原型链—prototype chain)