原型链

作者: 马建阳 | 来源:发表于2017-08-12 23:52 被阅读11次

什么是原型链

我们知道 JS 有对象,比如

var obj = { name: 'obj' }

我们可以对 obj 进行一些操作,包括

  • 「读」属性
  • 「新增」属性
  • 「更新」属性
  • 「删除」属性

下面我们主要来看一下「读」和「新增」属性。

为什么有 valueOf / toString 属性呢?

在我们没有对 obj 进行任何其他操作之前,发现 obj 已经有几个属性(方法)了:


那么问题来了:valueOf / toString / constructor 是怎么来?我们并没有给 obj.valueOf 赋值呀。
要搞清楚 valueOf / toString / constructor 是怎么来的,就要用到 console.dir 了。

上面这个图有点难懂,我手画一个示意图:
我们发现 console.dir(obj) 打出来的结果是:
  1. obj 本身有一个属性 name(这是我们给它加的)
  2. obj 还有一个属性叫做 __ proto __(它是一个对象)
  3. obj.__ proto __ 有很多属性,包括 valueOf、toString、constructor 等
  4. obj.__ proto __ 其实也有一个叫做 __ proto __ 的属性(console.log 没有显示),值为 null

现在回到我们的问题:obj 为什么会拥有 valueOf / toString / constructor 这几个属性?
答案:这跟 __ proto __ 有关。

当我们「读取」 obj.toString 时,JS 引擎会做下面的事情:

  1. 看看 obj 对象本身有没有 toString 属性。没有就走到下一步。
  2. 看看 obj.__ proto __ 对象有没有 toString 属性,发现 obj.__ proto __ 有 toString 属性,于是找到了
    所以 obj.toString 实际上就是第 2 步中找到的 obj.__ proto __.toString。
    可以想象,
  3. 如果 obj.__ proto __ 没有,那么浏览器会继续查看 obj.__ proto __. __ proto __
  4. 如果 obj.__ proto __ . __ proto __ 也没有,那么浏览器会继续查看 obj.__ proto __ . __ proto __ . __ proto __
  5. 直到找到 toString 或者 __ proto __ 为 null。

上面的过程,就是「读」属性的「搜索过程」。
而这个「搜索过程」,是连着由 proto 组成的链子一直走的。
这个链子,就叫做「原型链」。

原型链图:

共享原型链

现在我们有另一个对象

var obj2 = { name: 'obj2' }

如图:


那么 obj.toString 和 obj2.toString 其实是同一个东西,也就是 obj2.__ proto __.toString。
这有什么意义呢?
如果我们改写 obj2. __ proto __.toString,那么 obj.toString 其实也会变!
这样 obj 和 obj2 就是具有某些相同行为的对象,这就是意义所在。

差异化

如果我们想让 obj.toString 和 obj2.toString 的行为不同怎么做呢?直接赋值就好了:

obj.toString = function(){ return '新的 toString 方法' }
总结:
「读」属性时会沿着原型链搜索
「新增」属性时不会去看原型链(但是如果你给这个属性加了一些配置,则不一样)。

参考文章:https://zhuanlan.zhihu.com/p/23090041?refer=study-fe

相关文章

  • JavaScript 原型、原型链与原型继承

    原型,原型链与原型继承 用自己的方式理解原型,原型链和原型继承 javascript——原型与原型链 JavaSc...

  • 原型、原型链

    (什么是原型、原型链?有什么作用) JavaScirpt深入之从原型到原型链 图解 Javascript 原型链 ...

  • 原型链&查找规则&作用域链

    原型链(隐式原型链) 属性的查找规则(原型链的查找规则) 作用域链

  • 关于原型原型链的理解

    什么是原型? 什么是原型链? 为什么需要原型,和原型链?

  • 原型链实现继承

    原型链 原型链示意图 使用原型链实现继承 这是怎么回事呢? 原型链在哪? 听我细细道来~ 首先 Teacher 实...

  • 继承

    原型链直接继承 原型链直接继承prototype 原型链继承_prototype属性 继承_构造函数绑定

  • js中的实现继承的几种方式

    大纲:原型链借用构造函数组合继承原型式继承寄生式继承寄生组合式继承 1、原型链: 什么是原型链? 原型链的基本思想...

  • 【原型和原型链】什么是原型和原型链

    【原型和原型链】什么是原型和原型链https://blog.csdn.net/xiaoermingn/articl...

  • js原型链

    目录 1.对象的原型和原型链1.1什么是原型1.2查看原型1.3对象的原型链 2.使用构造函数2.1 函数的原型链...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

网友评论

      本文标题:原型链

      本文链接:https://www.haomeiwen.com/subject/incsrxtx.html