美文网首页Web前端之路
【转】什么是 JS 原型链?

【转】什么是 JS 原型链?

作者: 竿牍 | 来源:发表于2020-07-17 15:36 被阅读0次

我们知道 JS 有对象,比如

var obj = { name: 'obj' } 

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

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

为什么有 valueOf / toString 属性和方法 hasOwnPrototype / constructor 呢?

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


image.png

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

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


image.png

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


image.png
我们发现 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 / hasOwnPrototype这几个属性?

答案:

这跟 __proto__ 有关。

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

  1. 看看 obj 对象本身有没有 toString 属性。没有就走到下一步。

  2. 看看 obj.__proto__ 对象有没有 toString 属性,发现 obj.__proto__ 有 toString 属性,于是找到了

所以 obj.toString 实际上就是第 2 步中找到的 obj.__proto__.toString。

可以想象,

  1. 如果 obj.__proto__ 没有,那么浏览器会继续查看 obj.__proto__.__proto__

  2. 如果 obj.__proto__.__proto__ 也没有,那么浏览器会继续查看 obj.__proto__.__proto__.proto__

  3. 直到找到 toString 或者 __proto__ 为 null。

上面的过程,就是「读」属性的「搜索过程」。

而这个「搜索过程」,是连着由 __proto__ 组成的链子一直走的。

这个链子,就叫做「原型链」。

共享原型链

现在我们有另一个对象

var obj2 = { name: 'obj2' }
image.png

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

这有什么意义呢?

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

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

差异化

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

直接赋值就好了:

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

总结:

「读」属性时会沿着原型链搜索。

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

相关文章

  • 原型和原型链

    转自:https://juejin.im/post/6844903797039300615 原型和原型链是 JS ...

  • 【转】什么是 JS 原型链?

    我们知道 JS 有对象,比如 我们可以对 obj 进行一些操作,包括: 「读」属性 「新增」属性 「更新」属性 「...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • 廖雪峰JS小记

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

  • 原型与新版的类-class

    首先来理解原型原型 === 共用属性可以先看看方姐的几篇文章:什么是JS原型链JS 中 proto 和 proto...

  • web前端面试之js继承与原型链(码动未来)

    web前端面试之js继承与原型链(码动未来) 3.2.1、JavaScript原型,原型链 ? 有什么特点? 每个...

  • 2022前端高频面试题

    JS相关 1.原型和原型链是什么 原型和原型链都是来源于对象而服务于对象的概念js中引用类型都是对象,对象就是属性...

  • 前端资料

    ES6新数据类型 Symbol . js变量提升函数提升 js this js 原型及原型链理解 new做了什么 ...

  • 原型对象和原型链二者的关系

    开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)...

网友评论

    本文标题:【转】什么是 JS 原型链?

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