美文网首页让前端飞JavaScript < ES5、ES6、ES7、… >
JS三大经典 | 原型链继承2018-09-28

JS三大经典 | 原型链继承2018-09-28

作者: littleyu | 来源:发表于2018-09-28 14:46 被阅读12次

1. 什么是 JS 原型链?

2. this 的值到底是什么?

3. JS 的 new 到底是干什么的?

这是 JS 里的三个经典概念,自学者必须学会,否则无法通过面试。
今天主要来说一说自己对JS原型链继承的理解。

我们知道 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 方法' }

总结:

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

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

相关文章

  • js基础之实现继承的几种方式

    js 实现继承的方式有: 原型链继承; 构造函数继承; 组合继承(原型链继承 + 构造函数继承)(最常用);(原型...

  • JS高级 03

    JS实现继承的方式 1.属性拷贝 2.原型式继承 3.原型链继承 4.借用构造函数继承|伪对象继承|经典点继承 5...

  • js继承

    js继承js 继承-简书 原型链实现集继承 上面的代码实现原型链继承最重要的son.prototype=new f...

  • JavaScript的六种继承方式

    JavaScript的几种继承方式 原型链继承 借助构造函数继承(经典继承) 组合继承:原型链 + 借用构造函数(...

  • js实现继承的几种方式

    js实现继承有几种方式,这里我们主要探讨 原型链继承 构造继承 组合继承(原型链和构造继承组合到一块,使用原型链实...

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

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

  • 浅析JS继承方法

    JS 实现继承的方法有:1.原型链继承2.构造函数继承3.组合继承(原型链继承 + 构造函数继承)4.原型式继承(...

  • JS汇总---面向对象&数组

    面向对象 js原型链的继承 静态属性怎么继承 js原型链以及特点 面向对象有哪几个特点 封装,继承,多态 对象的继...

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

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

  • 彻底弄清js继承的几种实现方式

    js有几种经典的继承方式。比如原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承。让我们一一分析并实现。...

网友评论

    本文标题:JS三大经典 | 原型链继承2018-09-28

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