js - 原型和原型链的简单理解

news2024/9/23 11:46:15

前言

有一个概念需要清楚,只有构造函数才有.prototype对象,对象是没有这个属性的,__proto__只是浏览器提供的非标准化的访问对象的构造函数的原型对象的一种方式;

prototype(原型对象)

函数即对象,每个函数都有一个prototype属性,而这个属性就是这个函数的原型对象,在原型对象上定义的属性或方法,会被该函数的实例对象所继承,实例对象可以直接访问到原型对象里面的属性或方法。

原型对象相当于创造一种实例的一个模板,里面存放着这种实例的各种属性和方法;

比如:Arrary.prototype 里面存放着所有关于数组的方法;

console.log(Array.prototype);  //  filter,find,map,push,pop,some,sort...

对象是没有 prototype 的(感觉这句话有点问题),如下:

  console.log("123".prototype); 		// undefined
  console.log({name:'Eula'}.prototype); // undefined
  console.log((123).prototype);			// undefined
  console.log([123].prototype);			// undefined

_proto_(原型链的连接)

不知大家在控制台调试时有没有发现__proto__这个属性,这个属性其实是在实例被创建的时候,JS引擎为实例自动添加的一个属性,它是绝对等于其构造函数的prototype属性的;
也就是说,实例的__proto_就是这个实例的原型对象,但是代码上不推荐直接访问__proto__,__proto__又称为隐式原型对象。
如下:

	console.log("123".__proto__); 			// String类型
    console.log({ name: "Eula" }.__proto__);// Object类型
    console.log((123).__proto__);			// Number类型
    console.log([123].__proto__);			// Arrary类型

打印如下:

在这里插入图片描述
其实也就等同于下面的代码:顺序是一一对应的:

	console.log(String.prototype);
    console.log(Object.prototype);
    console.log(Number.prototype);
    console.log(Array.prototype);

说明 : js中万物皆对象,String,Object,Number,Array等 都是js内置的构造函数,在 js中,由于一切皆对象,所以它们也可以称为内置对象,都有自己的原型对象,最顶层的原型对象是Object

他们的实例化对象 所使用的方法 会向各自的原型对象中逐层查找,直到找到为之;

其实这就是原型链的概念

当实例要访问某一个属性时,首先在实例自身查找,如果没有找到,则继续沿着__proto__对象查找,如果找到最终__proto__对象为null时都没找到,就返回属性未找到的错误,如果找到了则返回该属性值。而这个由若干个__proto__对象串联起来的查找路径,就称为原型链。

实战:

	class Person {
        constructor(name) {
          this.name = name;
        }
        say() {
          console.log(this.name + ":这个仇,我记下了。");
        }
      }
      let Eula = new Person("优菈");
      console.log("__proto__:", Eula.__proto__);
      console.log("prototype:", Person.prototype);
      console.log(Eula.__proto__ === Person.prototype);// true

打印如下:
在这里插入图片描述
我们可以发现 Eula.__proto__ === Person.prototype,也就是 实例化对象可以通过__proto__访问到原型对象;既然可以访问,我们也能在上面添加自己的属性和方法,如下:

  	 // 第一种添加方式
  	  注意此处添加函数不能使用箭头函数 否则this将指向window
  	 Eula.__proto__.fun = function() {
        console.log('this:',this);
        console.log("我的名字是:", this.name);
      };
      
      // 第二种添加方式
      Person.prototype.age = 18;
      Eula.fun();
      console.log(Eula);

打印如下:

在这里插入图片描述
使用这两种方式分别添加了属性和方法,需要注意的是第一种方式添加方法不能使用箭头函数,否则它的指向会指向window,这样就拿不到 Person 类下面的属性 了;


而且还可以通过原型对象的constructor 访问到构造函数:

	console.log(Person);
    console.log(Eula.__proto__.constructor === Person); //true

打印如下:
在这里插入图片描述

其实上面的案例是使用 class写的,换成function形式实现的效果其实是一样的,如下:

因为:ES的6class 的本质是 function。它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。

	   function Person(name) {
        this.name = name;
        this.say = function() {
          console.log(this.name + ":这个仇,我记下了。");
        };
      }
      let Eula = new Person("优菈");
      Eula.__proto__.fun = function () {
        console.log("this:", this);
        console.log("我的名字是:", this.name);
      };
      Person.prototype.age = 18;;
      console.log("__proto__:", Eula.__proto__);
      console.log("prototype:", Person.prototype);
      console.log(Eula.__proto__ === Person.prototype);// true
      console.log(Eula.__proto__.constructor === Person); //true
      Eula.fun();//新增的方法

此处放一张关于原型、构造函数、实例、原型链的流程图:不难理解

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录 数组篇 螺旋矩阵II Java实现

文章目录 (中等)59. 螺旋矩阵II(中等)54. 螺旋矩阵(简单)JZ29 顺时针打印矩阵 (中等)59. 螺旋矩阵II 因为我是先做的JZ29,所以看到这题的时候,几乎就是一样的…

最适合家用的洗地机哪个牌子好?2023洗地机推荐

洗地机是目前众多清洁工具中的热门之选,我身边很多朋友都选择了洗地机来处理家居清洁,一说一,洗地机可以处理干湿垃圾,还都有一键自清洁功能,用起来确实方便简单。不过,市面上的洗地机参差不齐,…

RabbitMQ 详解

文章目录 RabbitMQ 详解一、MQ 简介1. MQ优缺点2. MQ应用场景3. AMQP 和 JMS4. 常见的 MQ 产品 二、RabbitMQ 工作原理三、Linux环境安装RabbitMQ1. 安装 Erlang2. 安装 RabbitMQ3. 管控台 四、RabbitMQ 工作模式1. 简单模式(Hello World)2. 工作队列模式(Work Queue)3. 发布订…

PMP项目管理-[第十三章]相关方管理

相关方管理知识体系: 识别相关方: 规划相关方参与: 管理相关方参与: 监督相关方参与 : 13.1 识别相关方 定义:定期识别项目相关方,分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成…

rk3568 修改开机logo

rk3568 修改开机显示logo Android 显示 logo 的作用是为了标识应用程序或设备的品牌和身份。在应用程序中,logo 可以帮助用户快速识别应用程序,并与其他应用程序区分开来。在设备中,logo 可以帮助用户识别设备的品牌和型号,以及与…

抽象轻松js

全新声明类型2.0版本 var、let、const 三者的区别 用我的世界来区别三者关系 特别的本质关系是一样,都是有木头(声明)钻石(赋值)组成 木头(声明)钻石(赋值) 钻石剑(…

鸿蒙Hi3861学习六-Huawei LiteOS-M(软件定时器)

一、简介 软件定时器,是基于系统Tick时钟中断且由软件来模拟的定时器。当经过设定的Tick时钟计数值后,会触发用户定义的回调函数。定时精度与系统Tick时钟周期有关。 硬件定时器受硬件的限制,数量上不足以满足用户的实际需求。因此&#xff0…

如何监控软件定义的数据中心(SDDC)

网络管理不仅要防止网络停机,还要优化网络性能,最终增强最终用户体验。当今的网络变得如此先进,以至于传统模型已经过时,无法满足现代动态需求。用日益敏捷、安全、可扩展和可靠的现代可部署解决方案取代传统的遗留系统至关重要。…

企业遭受勒索攻击后,要支付赎金吗?

企业遭受勒索攻击后,要支付赎金吗? 针对这个问题的答案,一些企业选择了“不要”。例如:意大利法拉利公司拒绝向黑客支付赎金;蔚来汽车老板拒绝支付1500万的赎金;澳洲最大医保公司在被盗取970万客户信息后&a…

关于《永恒之塔私服》收费模式的大胆猜想

我们都知道从第一个网络游戏走进中国时就已经使用了点卡模式的收费方式,但是随着游戏行业的快速发展,这种点卡模式的游戏也渐渐快要退出游戏收费的平台,也随着越来越多的游戏加入到中国的游戏市场也导致了游戏的竞争也越来越大,游戏公司也挖空心事来吸引玩家,为了吸引玩家2004年…

景23转债,海能转债上市价格预测

景23转债 基本信息 转债名称:景23转债,评级:AA,发行规模:11.54亿元。 正股名称:景旺电子,今日收盘价:22.52元,转股价格:25.71元。 当前转股价值 转债面值 / …

汉诺塔+小青蛙跳台阶---《递归》

目录 前言: 1.汉诺塔: 1.1分析盘子数从1-3的情况 1.2盘子移动的规律总结 2.青蛙跳台阶: 2.1跳一个台阶或跳两个台阶 2.2扩展 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打…

asp.net+C#教育机构高校教务管理系统

1.1用户类别 本系统分为3个角色:管理员、教师、学生; 1、管理员权限最大,排课、调课、汇总各类考试成绩、管理各类用户基本信息,以及各类查询统计、发布公告、收发邮件等功能; 2、教师查看自己的信息、修改登陆密码…

[C++]C++入门(一)

目录 前言: 一、C关键字: 二、命名空间: 三、C输入和输出: 四、缺省参数: 五、函数重载: 六、引用: 常引用: ​编辑引用和指针的区别: 引用和指针的不同点&…

九联UNT401H-Hi3798MV300/MV310-当贝纯净桌面-强刷卡刷固件包

九联UNT401H-Hi3798MV300/MV310-当贝纯净桌面-强刷卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置…

达摩院开源多模态对话大模型mPLUG-Owl

miniGPT-4的热度至今未减,距离LLaVA的推出也不到半个月,而新的看图聊天模型已经问世了。今天要介绍的模型是一款类似于miniGPT-4和LLaVA的多模态对话生成模型,它的名字叫mPLUG-Owl。 论文链接:https://arxiv.org/abs/2304.14178…

《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

文章目录 一、验证说明二、Etherscan Key三、验证插件四、源码认证4.1 Remix验证(推荐)4.1.1 无构造参数合约验证4.1.2 有构造参数合约验证 4.2 单文件验证(不推荐)4.3 Hardhat部署(按照需要) 五、验证结果…

( 位运算 ) 461. 汉明距离 ——【Leetcode每日一题】

❓461. 汉明距离 难度:简单 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 示例 1: 输入:x 1, y 4 输出:2 解释: 1…

Python 字典修改对应的键值

将 key ‘1’ 的值 ‘1’, ‘3’, ‘5’ 字符,修改为 ‘2’, ‘4’, ‘5’ 。 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么简单………

Cy5.5 NHS ester 氨基反应性荧光染料Cyanine5.5 -NHS

Cy5.5 NHS ester是一种常用的荧光探针,可用于细胞或组织的荧光标记,也可用于蛋白质或核酸的标记。Cy5.5 NHS ester的荧光峰位于近红外区域,波长为675nm,具有较强的荧光强度和较长的荧光寿命,适合于生物分子在体内或组织…