首页 > 其他分享 >js原型链理解

js原型链理解

时间:2024-10-24 14:49:04浏览次数:1  
标签:__ proto js 理解 原型 Array prototype 构造函数

原型链

  • 原型 (prototype)
  1. 每个函数上面都有一个prototype属性(天生的),因为这个属性的值是个对象,也被称之为原型对象
  2. 函数和构造函数的区别:构造函数和普通函数在js中都是一样的没有区别,只是大家约定俗成构造函数首字母必须大写,用来区分于普通函数(驼峰命名)
  • 作用
  1. 存放一些属性和方法
  2. 在JavaScript中实现继承
  • 案例:实例化函数继承方法
const arr = new Array(1,2,3);
arr.reverse(); // 反转
arr.sort(); // 排序
console.log(typeof Array); // function (万物皆起源于函数=.=)
  • 为什么 Array函数在实例化之后就可以使用一些 reverse sort方法啊
  1. 官方在Array函数(构造函数)的prototype原型上,已经挂载了很多方法

  2. Array函数的prototype方法如下

  3. 我们通过new Array()的到一个实例,而这个实例是一个Object 对象, 这就得涉及到了对象上得__proto__属性了

  • 原型链(链接点): proto
  1. 每个Object对象都会有__proto__属性(天生的)
  2. 作用: 这个属性指向它的构造函数的原型。
  3. 问题:它的构造函数是谁?构造函数的原型又是谁
  4. 我们上面写了,Array是一个构造函数,new Array()是实例化了这个构造函数,而这个实例的构造函数也就是指向的 Arrar函数,new Array的构造函数的原型,就是Array的原型(prototype)
  • 现在我们知道__proto__指向它的构造函数的原型(Array.prototype),我们调用reverse() stor()方法的时候他是如何查找的呢
  1. 这个就涉及到js的原型链查找了,当你去调用 arr.stor() 方法的时候,我们知道arr是个对象{},我们就去对象的prop属性上去查找是否有该属性

  2. 如果没有该属性,就回去该对象的__proto__上查找(官方定义的查找规则),arr.proto 指向的就是它的构造函数的原型(prototype) -> Array.prototype

  3. 找到 Array.prototype 之后发现上面有官方定义的一些方法,就可以调用了

  4. 假如这个构造函数的原型上,没有sort()这个方法, 会怎么查找呢?

  5. 我们知道 构造函数的原型(Array.prototype)是个对象,我们上面又提到 每个Object对象都会有__proto__属性(天生的),这时候它就会到构造函数的原型对象上的 proto 上查找,我们又知道 proto 属性指向它的构造函数的原型,这里问题来了 Array.prototype “对象” 的构造函数是谁啊?

  6. Array.prototype.proto == Object.prototype, 是的 Array.prototype.proto 的构造函数就是Object “函数”,注意Object是函数

  7. Object 是函数它就有 prototype 属性,函数的prototype 是对象类型,对象天生又有 proto 属性,那么 Object.prototype.proto 是什么呢,答案是null,到这里我们就找到了根了(Object.prototype.proto),这个查找的过程其实就是原型链,而 proto 属性是原型链中链接的一个点,更加准确一点来说, proto 是 “链接点”

原型链图片:

学习理解视频地址:https://www.bilibili.com/video/BV1LY411d7Yt?spm_id_from=333.788.player.switch&vd_source=a17611293c8bd88bb5a97cc6ca959b5e

标签:__,proto,js,理解,原型,Array,prototype,构造函数
From: https://www.cnblogs.com/liangziaha/p/18499584

相关文章

  • Nuxt.js 应用中的 builder:watch 事件钩子详解
    title:Nuxt.js应用中的builder:watch事件钩子详解date:2024/10/24updated:2024/10/24author:cmdragonexcerpt:builder:watch是Nuxt.js中的一个生命周期钩子,在开发环境的构建过程期间被调用。它允许开发者在监视到项目中的文件或目录发生变化时,执行特定的操作。这......
  • 栈的理解及相关算法
    一、栈的基础概念1、栈的定义栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。栈顶(Top):线性表允许进行插入删除的那一端。栈底(Bottom):固定的,不允许进行插入和删除的另一端。空栈:不含任何元素的空表。栈又......
  • VUEJS实例中DATA属性的三种写法及区别是什么
    Vue.js是一种流行的JavaScript前端框架,用于构建交互式的用户界面。VUEJS实例中DATA属性的三种写法及区别是:1、独立性;2、推荐性;3、ES6语法。其中,独立性是指,使用函数返回一个对象的写法确保了每个组件实例都拥有独立的数据,不会相互影响。而直接使用对象声明DATA属性的写法会导致数......
  • 线段树初步理解
    今天ZRtes爆零咯,就不在tes里写了引言:以前一直只会用线段树2,线段树也是一直当做工具使用,一切线段树的科技除了线段树分治基本都不会,因此特作此文记之线段树的lazytag与pushdown为了保证时间复杂度,线段树在做区间修改的时候引入了lazytag的概念,目的是为了节省没必要的时......
  • 【NLP自然语言处理】Attention机制原理揭秘:赋予神经网络‘聚焦’与‘理解’的神奇力量
    目录......
  • js 富文本转义及反转义(包含vue版本的)
    //js//富文本反转义htmlfunctionescape2Html(str){  vararrEntities={'lt':'<','gt':'>','nbsp':'','amp':'&','quot':'"'};returnst......
  • 报error:0308010C:digital envelope routines::unsupported错--nodejs版本过高(nvm安
    最近小编入职实习,运行(npmrundev)前端项目时报error:0308010C:digitalenveloperoutines::unsupported的错,一查发现原来是nodejs版本过高,与项目不匹配。接下来介绍更换nodejs版本的方法。第一种:官网下载通过nodejs官网下载安装,但有个缺陷,不同版本的nodejs无法顺利的切换......
  • 【Ambari编译报错】phantomjs从github上下载失败导致无法编译的问题
    PhantomJS下载失败问题1.错误分析下面是完整的报错日志:[ERROR]npmverbunsafe-perminlifecycletrue[ERROR]npmverbunlockdoneusing/root/.npm/_locks/phantomjs-ca2567298810d09d.lockfor/opt/modules/ambari/ambari-admin/src/main/resources/ui/admin-......
  • 海康威视AI开放平台训练数据集导入问题---解决导入自己数据集的问题(txt转json格式)
    一、问题导入首先我们先进入到开放平台中,选择物体检测最近在做一个项目,需要使用到海康威视AI开放平台来训练数据集,但是刚开始遇到了一个问题就是导入自己的数据集(txt格式转成了json格式)为啥没有用,后面查看相关文档,解决了导入自己数据集的问题,就不用在平台里标注了。二、探......
  • Golang 中使用 JSON 的一些小技巧
    临时忽略struct字段typeUserstruct{Emailstring`json:"email"`Passwordstring`json:"password"`//manymorefields…}临时忽略掉Password字段json.Marshal(struct{*UserPasswordbool`json:"password,omitempty"`}{Us......