网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!

简介: 网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!

前言

在上篇文章中,我们讲解了一下原型链,并说明了原型和原型链之间的关系。接下来我们深入了解一下原型链,并一起来攻破一道网易的面试题。

我们先来回顾一下:

Ground.prototype.lastName = '贺'
  function Ground() {
  }
  var ground = new Ground()
  Father.prototype = ground
  function Father() {
    this.name = 'jingwei'
  }
  var father = new Father()
  Son.prototype = father
  function Son() {
    this.hobbit = 'reading'
  }
  var son = new Son()
  console.log(son.name);
  console.log(son.lastName);

这里会输出:

image.png

  1. 当访问对象属性时,先找对象显示具有的属性,没找到再去找对象的隐式原型
  2. 实例对象的隐式原型 === 构造函数的显示原型
  3. 顺着对象的隐式原型不断地向上查找上一级的隐式原型,直到找到目标或者一直到null,这种查找关系叫做原型链

接下来我们再来看一道例题:

Person.prototype = {
    name: '菌菌',
    sayName: function() {
      console.log(this.name);
    }
  }
  function Person() {
    this.name = '来颗奇趣蛋'
  }
  var p = new Person()
  p.sayName()

小伙伴思考一下会输出什么?

当我们访问p.sayName()时,先去实例对象p中找显示属性,显示属性并没有sayName,于是从p的隐式原型也就是Person的显示原型中查找,sayName: function() {       console.log(this.name);。然后输出this.name,此时的关键就在于函数原型中的this到底指向谁,是指向实例对象p还是指向函数原型呢?

我们来看看输出结果:

image.png

我们可以看到,最终输出结果为 来颗奇趣蛋,所以这道题中的this应该是指向实例对象p的,所以会输出p中的属性name

我们总结一下,函数原型中的this跟构造函数中的this一样,都指向构造函数构造出的实例对象

接下来给大家看一张很厉害很出名的图,它可以帮助我们更好地理解原型链:

image.png

这是一张原型链的图,我们先从左上角实例对象f1,f2开始看,f1的_proto_(隐式原型)也就是构造函数的显示原型Foo.prototype,constructor在我们原型的文章中有讲过,它是记录对象是由谁创建的,所以Foo.prototype的创造者为function Foo().Foo.prototype为一个对象,它是由构造函数Object()产生的,所以Foo.prototype的_proto_为Object.prototype,而我们上篇文章讲了,Object.prototype的原型为null,同时也作为原型链的一个终止。

我们知道,函数也是一个对象,那么函数也有它的隐式原型。比如这里的function Object(),图片上提示了它是由Function()创造,那么它的_proto就是Function.prototype。同理,Foo()也是由Function()创造,那么它的_proto_也是Function.prototype.

这些都遵循着 对象的隐式原型 === 构造函数的显示原型规则,但是这张图有一个例外:

image.png

就是函数Function()的隐式原型等于它自身的显示原型,也就是Function.prototype.

如果小伙伴们看懂了这张图,那么对原型和原型链的理解已经很深了,以后看到原型和原型链那就是秒杀。

接下来我们来看面试题:

网易面试题

所有对象最终都会继承自Object.prototype?

通过对原型和原型链的学习,以及对刚刚讲解的那张图的理解,我们知道对象会顺着自己的隐式原型不断地向上查找,最终会继承到Object.prototype,那么所有的对象都会继承到吗?

Object.create()方法创造对象


let obj2 = Object.create(null)

我们用Object.create()的方法创造一个对象时,传入空null,这样的话我们就创造出了一个空对象,我们在浏览器中输出一下obj2

image.png

Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法

今天的内容就到这啦,如果你觉得小编写的还不错的话,或者对你有所启发,请给小编一个辛苦的赞吧

相关文章
|
2月前
|
JavaScript 前端开发 开发者
讲述Vue框架中用于对象响应式变化的Object.defineProperty函数。
综上所述,Vue.js通过 `Object.defineProperty()`提供了强大的响应式能力,使得状态管理变得简洁高效。这种能力是Vue.js受到广大开发者青睐的重要原因之一。尽管Vue 3.x使用Proxy替代了该方法,但对于Vue 2.x及其之前版本,`Object.defineProperty()`是理解Vue.js内部工作机制不可或缺的一部分。
123 27
|
8月前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
448 17
|
6月前
|
前端开发 数据处理
对象数据的读取,看这一篇就够了!Object.keys()、Object.values()和Object.entries()用法详解;如何获取对象原型链上的属性
Object.keys()、Object.values()和Object.entries()都是利于对象操作的便捷方法,能有效提升数据处理的效率。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
12月前
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
131 1
ES6中map对象的使用,确实比Object好使哈
|
11月前
|
Python
通过 type 和 object 之间的关联,进一步分析类型对象
通过 type 和 object 之间的关联,进一步分析类型对象
165 3
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
11月前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
179 0
|
SQL 存储 数据库
对象关系映射(Object-Relational Mapping)
【8月更文挑战第17天】
295 2
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
|
6月前
|
安全 IDE Java
重学Java基础篇—Java Object类常用方法深度解析
Java中,Object类作为所有类的超类,提供了多个核心方法以支持对象的基本行为。其中,`toString()`用于对象的字符串表示,重写时应包含关键信息;`equals()`与`hashCode()`需成对重写,确保对象等价判断的一致性;`getClass()`用于运行时类型识别;`clone()`实现对象复制,需区分浅拷贝与深拷贝;`wait()/notify()`支持线程协作。此外,`finalize()`已过时,建议使用更安全的资源管理方式。合理运用这些方法,并遵循最佳实践,可提升代码质量与健壮性。
182 1