美文网首页
原型与原型链

原型与原型链

作者: 松鼠煮鳜鱼 | 来源:发表于2019-01-22 18:04 被阅读0次

作者:方应杭
链接:https://zhuanlan.zhihu.com/p/23090041
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我们知道 JS 有对象,比如

var obj = { name: 'obj' } 

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

  • 「读」属性

  • 「新增」属性

  • 「更新」属性

  • 「删除」属性

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

为什么有 valueOf / toString 属性呢?

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

image

<u>那么问题来了:valueOf / toString / constructor 是怎么来?我们并没有给 obj.valueOf 赋值呀。</u>

要搞清楚 valueOf / toString / constructor 是怎么来的,就要用到 console.dir 了。

image 上面这个图有点难懂,我手画一个示意图: image

我们发现 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 组成的链子一直走的。

<u>这个链子,就叫做「原型链」。</u>

共享原型链

现在我们有另一个对象

var obj2 = { name: 'obj2' }

如图:

image

那么 obj.toString 和 obj2.toString 其实是同一个东西,也就是 obj2.proto.toString。

这有什么意义呢?

如果我们改写 obj2.proto.toString,那么 obj.toString 其实也会变!

这样 obj 和 obj2 就是具有某些相同行为的对象,这就是意义所在。

差异化

如果我们想让 obj.toString 和 obj2.toString 的行为不同怎么做呢?

直接赋值就好了:

obj.toString = function(){ return '新的 toString 方法' }

image

总结:

「读」属性时会<u>沿着原型链搜索</u>

「新增」属性时<u>不会</u>去看原型链(但是如果你给这个属性加了一些配置,则不一样,以后讲)。

相关文章

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

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

  • 2019-01-28

    原型与原型链

  • 廖雪峰JS小记

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

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • JavaScript 面向对象第一篇

    1.原型链 ---- (实例对象与原型之间的连接 叫做原型链) 2. hasOwnproperty ----(看是...

  • 原型与原型链以及继承

    今天复习下原型与原型链的知识,以及记录新学的继承知识点。 知识点纲要 原型与原型链 es5与es6继承 什么是原型...

  • JavaScript深入理解this关键字(一)

    摘要 最近在公司需要做培训,我打算把JavaScript中的原型与原型链讲给大家。但我在梳理原型与原型链的时候发现...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • 原型链&instanceof关键字

    1.原型链&instanceof关键字 简单说明 原型链 与 instanceof 作用原理 1.原型链 1...

  • 原型、原型链

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

网友评论

      本文标题:原型与原型链

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