JS的魔法三角:constructor、prototype与__proto__

news2024/12/27 7:52:52

在JavaScript中,constructorprototype__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角:

1. constructor

  • 定义constructor是一个函数,它被用来初始化一个新创建的对象实例。当使用new关键字创建一个新的对象时,构造函数会被调用。

  • 作用:主要负责为新创建的对象设置初始属性和方法。

  • 示例

    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    
    const Kobe = new Person('Kobe', 24);
    

2. prototype

  • 定义:每个函数都有一个prototype属性,它是一个对象,用于存储可以被该函数的所有实例共享的方法和属性。

  • 作用:通过prototype属性,可以实现原型链继承,允许子类继承父类的属性和方法。

  • 示例

    Person.prototype.greet = function() {
      console.log(`my name is ${this.name}.`);
    };
    
    const Kobe = new Person('Kobe', 24);
    Kobe.greet(); // "my name is kobe."
    

3. __proto__

  • 定义__proto__是每个对象的一个内部属性(非标准属性),指向该对象的原型对象。在ES6中,推荐使用Object.getPrototypeOf()Object.setPrototypeOf()来获取或设置原型。

  • 作用__proto__是原型链的核心,当尝试访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript引擎会沿着__proto__链向上查找,直到找到该属性或者到达原型链的末端(通常是null)。

  • 示例

    const Kobe = new Person('Kobe', 24);
    console.log(Kobe.__proto__ === Person.prototype); // true
    

4. 关系

  • 构造函数与prototype

    • 每个构造函数都有一个prototype属性,这是一个对象,包含所有实例共享的方法和属性。
    • 当使用new关键字创建对象时,新对象的__proto__属性会被设置为构造函数的prototype对象。
  • __proto__与原型链

    • __proto__属性使得对象能够访问其构造函数prototype上的方法和属性。
    • 通过__proto__,可以形成一个从子对象到父对象的链式结构,即原型链。
  • constructorprototype

    • prototype对象上有一个默认的constructor属性,它指向构造函数本身。
    • 这个constructor属性可以帮助我们识别一个对象是由哪个构造函数创建的。

5. 图解

在这里插入图片描述
在这里插入图片描述

6. 示例代码

function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 在构造函数的原型上添加方法
Person.prototype.greet = function() {
  console.log(`my name is ${this.name}.`);
};

const Kobe = new Person('Kobe', 24);

// 查看Kobe的原型
console.log(Kobe.__proto__ === Person.prototype); // true

// 查看Person.prototype的constructor属性
console.log(Person.prototype.constructor === Person); // true

// 使用Kobe调用greet方法
Kobe.greet(); // "my name is Kobe."

// 原型链
console.log(Object.getPrototypeOf(Kobe) === Person.prototype); // true

7. 总结

  • constructor:构造函数,用于初始化新创建的对象实例。
  • prototype:构造函数的原型对象,用于存储可以被所有实例共享的方法和属性。
  • __proto__ :对象的内部属性,指向该对象的原型对象,用于实现原型链继承。

这就是JS的魔法三角吗?看起来并不难吧?

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

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

相关文章

SQL调优分析200倍性能提升

原始SQL: selectdistinct cert.emp_id fromcm_log cl inner join(selectemp.id as emp_id,emp_cert.id as cert_id fromemployee emp left joinemp_certificate emp_cert on emp.id emp_cert.emp_id whereemp.is_deleted0) cert on (cl.ref_tableEmployee and c…

逆向攻防世界CTF系列42-reverse_re3

逆向攻防世界CTF系列42-reverse_re3 参考:CTF-reverse-reverse_re3(全网最详细wp,超4000字有效解析)_ctfreverse题目-CSDN博客 64位无壳 _int64 __fastcall main(__int64 a1, char **a2, char **a3) {int v4; // [rsp4h] [rbp-…

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组:java.lang.Class类第二组:java.la…

【热门主题】000075 探索嵌入式硬件设计的奥秘

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步,无以至千里;不积小流…

mysql系列2—InnoDB数据存储方式

背景 本文将深入探讨InnoDB的底层存储机制,包括行格式、页结构、页目录以及表空间等核心概念。通过全面了解这些基础概念,有助于把握MySQL的存储架构,也为后续深入讨论MySQL的索引原理和查询优化策略奠定了基础。 1.行格式 mysql中数据以行…

vue实现echarts饼图自动轮播

echarts官网:Examples - Apache ECharts echartsFn.ts 把echarts函数封装成一个文件 import * as echarts from "echarts";const seriesData [{"value": 12,"name": "过流报警"},{"value": 102,"name&qu…

【Python数据分析五十个小案例】使用自然语言处理(NLP)技术分析 Twitter 情感

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 项目简介 什么是情感分析 情感分析(Sentiment Analysis)是文本分析的一部分,旨在识别文本中传递的情感信息&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日,北交所上市审核委员会将召开2024年第24次上市委审议会议,届时将审议武汉宏海科技股份有限公司(以下简称,宏海科技)的首发上会事项。 在上会之前,宏海科技共收到北交所下…

算法日记 36-38day 动态规划

今天把动态规划结束掉,包括子序列以及编辑距离 题目:最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &…

Gopeed 1.6.3 | 不限速下载工具附百度网盘不限速教程

Gopeed是一款高效且易于使用的下载软件。它具有加速下载速度的功能,可以帮助用户更快地下载文件。此外,Gopeed还支持多线程下载,可以同时下载多个文件,提高下载效率。它提供了简洁的界面和简单的操作,方便用户操作和管…

K8S版本和istio版本的对照关系

版本对照关系 下载地址1 下载地址2

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念: RDD: 弹性分布式数据集; DataFrame: DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

如何调用百度文心一言API实现智能问答

诸神缄默不语-个人CSDN博文目录 百度需要先认证个人信息才能使用LLM API。 文章目录 1. 获得 API Key2. 撰写代码并实现提问和回答2.1 用openai包实现调用2.2 用openai包实现流式调用2.3 用openai包实现工具调用2.4 构建智能体2.5 文生图2.6 图生图 3. 用gradio建立大模型问答…

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式,各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据,使用xlwt库创建和编辑excel表,在办公自动化方面可以方便我们快速处理数据,帮助我们提升效率。 python之open…

JMeter 并发策略-针对准点秒杀场景的压测实现

一、场景的压测实现 1,创建线程组,10并发用户执行5次; 2,创建 Synchronizing Timer 元件,用于同步线程,设置同步元件 Synchronizing Timer 3,创建 http 请求4,创建 view results in table 元件…

损失函数分类

1. NLLLoss(负对数似然损失) 定义: 直接对预测的概率 p(yi) 的负对数求平均。通常配合 Softmax 使用,输入为对数概率。 优点: 对离散分类问题效果良好。更灵活,用户可以自行计算 Softmax。 缺点&#x…

【热门主题】000072 分布式数据库:开启数据管理新纪元

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

算法笔记:力扣148. 排序链表

思路: 将链表中的节点一一取出放到list集合中,然后通过Comparator实现排序,对排序好的list节点一一取出,组成排序好的新链表。 关键思路: Comparator实现对ListNode的排序; 💡注意&#xff…