美文网首页
彻底理解 JavaScript 原型对象与原型链

彻底理解 JavaScript 原型对象与原型链

作者: 扶得一人醉如苏沐晨 | 来源:发表于2023-10-18 19:01 被阅读0次

一、对象的原型([[prototype]]或者__proto__

JavaScript 中所有的对象中都包含了一个[[prototype]]内部属性

这个属性值所对应的就是该对象的原型

[[prototype]]作为对象的内部属性,是不能被直接访问的。

所以为了方便查看一个对象的原型,Chrome等大型浏览器厂商提供了__proto__这个非标准对象原型访问器

ECMA 引入了标准对象原型访问器 Object.getPrototype(Object)

二、函数的 prototype

下面两句话很重要

1、每一个函数都有一个prototype属性,但是普通对象是没有的;
prototype下面又有个construetor,指向这个函数。

2、每个对象都有一个名为_proto_的内部属性,指向它所对应的构造函数的原型对象,原型链基于_proto_;

不出意外你应该是晕了,没事,我们用图表示一下:

image.png

eg

image.png

Object是我们的构造对象的顶级函数

它的prototype属性就是Object的原型对象

Object的原型对象的constructor就指向Object函数本身

三、对象__proto__和函数的prototype的关系

3.1、相关知识

构造函数

3.2、构造函数是什么

3.3、构造函数的原理(new之后发生了什么)

官方解释:

  1. 创建一个空的简单JavaScript对象(即{});
  2. 为步骤1新创建的对象添加属性__proto__,将该属性链接至构造函数的原型对象
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this

咱们的总结:

1、自从用new调用函数后,JS引擎就会在内存中创建一个空对象{}const newObj = {};
2、将新对象newObj的__proto__属性链接至构造函数的原型对象 newObj.__proto__ = FunctionName.prototype
3、构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)this = newObj
4、执行构造函数内部代码;
5、如果该函数没有返回对象,则默认返回this。

构造函数中的this指向,指向构造出来的实例对象

3.4、构造函数创建实例

const Person = function () {
  this.name = "张三";
};

const p = new Person();

console.log(p.__proto__ === Person.prototype); //true

我们定义了一个函数Person

使用Persong构造函数创建一个p的实例对象

实例p的原型__protp__指向构造函数Personprototype

所以函数的 prototype 和 对象的 [[Prototype]]或者__proto__ 指向同一个原型对象

那我们继续更新图:

image.png

四、原型链

当我们要在一个对象(假设对象 A)上访问一个属性

JavaScript 首先会看对象 A 本身存不存在目标属性

若不存在,则会通过它的 [[Prototype]]或者__proto__ 查看它的原型对象(假设对象 B)存不存在待查找属性

若还是不存在,则继续查找原型对象 B 的原型 [[Prototype]]或者__proto__ (假设对象 C)存不存在目标属性

一直到找到属性或者返回 null(就是找到 Object 了,还是没找到属性)

其中 对象 A —> 对象 B —> 对象 C —> … —> Object 就是原型链的基本模型

最后更新一次关系图:

image.png

相关文章

  • 原型、原型链

    理解JavaScript原型 彻底理解JavaScript原型 原型 原型是一个对象,所有对象都可以成为原型,其...

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

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

  • 廖雪峰JS小记

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

  • 个人对面向对象的理解

    我对原型和原型链式这样理解的,原型和原型链在javascript当中主要用来体现对象 与属性之间的关系,它主要应用...

  • 前端基础整理

    如何理解JavaScript原型链JavaScript中的每个对象都有一个prototype属性,我们称之为原型,...

  • 原型与原型链

    JavaScript仍然大量地使用了对象,为了保证对象之间的联系,JavaScript引入了原型与原型链的概念。 ...

  • javascript碎片知识001

    javascript中的对象(原型,原型链) 什么是原型? 原型是JavaScript中的继承的基础,JavaSc...

  • JavaScript实现继承的几种方式及其优缺点

    原型链 要搞懂JavaScript的继承,首先要先理解JavaScript的原型链。 每一个实例对象都有一个pro...

  • ES6 原型和原型链相关面试题

    javascript原型与原型链 每个函数都有一个prototype属性,被称为显示原型 每个实例对象都会有_ _...

  • 原型和原型链篇

    原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 原型设计模式JavaScript是一种基于...

网友评论

      本文标题:彻底理解 JavaScript 原型对象与原型链

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