当前位置: 首页 > news >正文

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

在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的魔法三角吗?看起来并不难吧?

相关文章:

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

在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...

CA系统(file.h---申请认证的处理)

#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件&#xff0c;返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…...

matlab显示sin二维图

1&#xff0c;新建脚本 2、保存脚本 3、脚本命令&#xff1a;clc 清除 脚本命令的信息 clrear all 清除全部 4工作区内容&#xff1a;变量啥的 x0:0.001:2*pi%% 开始 精度 中值 ysin(x) y1cos(x) figure%%产生一个屏幕 plot(x,y)%%打印坐标 title(ysin(x))%%标题 xlabel(…...

验证 kubelet 服务已经停止并且不再生成错误日志

要验证 kubelet 服务已经停止并且不再生成错误日志&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 检查 kubelet 服务状态 首先&#xff0c;确认 kubelet 服务已经停止。 Bash 深色版本 sudo systemctl status kubelet 你应该看到类似以下的输出&#xff0c;表示服…...

【Linux】进程控制-----进程替换

目录 一、为什么要进行进程替换&#xff1a; 二、进程替换的原理&#xff1a; 三、exec家族&#xff1a; 1、execl&#xff1a; 2、execlp&#xff1a; 3、execv&#xff1a; 4、execvp&#xff1a; 5、execle和execve ​编辑 putenv&#xff1a; 一、为什么要进行进程…...

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本

安装SQL Server 2022提示需要Microsoft .NET Framework 4.7.2 或更高版本。 原因是&#xff1a;当前操作系统版本为Windows Server 2016 Standard版本&#xff0c;其自带的Microsoft .NET Framework 版本为4.6太低&#xff0c;不满足要求。 根据报错的提示&#xff0c;点击链接…...

使用ECharts创建带百分比标注的环形图

在数据可视化领域&#xff0c;环形图是一种非常有效的图表类型&#xff0c;它能够清晰地展示各部分与整体的关系。今天&#xff0c;我们将通过ECharts来创建一个带百分比标注的环形图&#xff0c;并详细解释如何实现这一效果。 1. 数据准备 首先&#xff0c;我们定义了一些基础…...

学习threejs,设置envMap环境贴图创建反光效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CubeTextureLoader 立…...

go语言里的mkdir mkdirall有什么区别?

在Go语言中&#xff0c;os.Mkdir 和 os.MkdirAll 都是用来创建目录的函数&#xff0c;但它们之间存在一些关键的区别。 ### os.Mkdir - **功能**&#xff1a;os.Mkdir 用于创建一个单一的目录。如果该目录已经存在&#xff0c;则会返回一个错误。 - **参数**&#xff1a; - na…...

使用Python OpenCV实现图像形状检测

目录 一、环境准备 二、读取和预处理图像 读取图像 灰度化 滤波去噪 三、边缘检测 四、查找轮廓 五、绘制轮廓 六、形状分类 七、显示结果 八、完整代码示例 九、总结 图像形状检测是计算机视觉领域中的一项关键技术,广泛应用于工业自动化、机器人视觉、医学图像处…...

继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题

上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...

基于RISC-V 的代理内核实验(使用ub虚拟机安装基本环境)

1.安装支撑软件 第一步&#xff0c;安装依赖库 RISC-V交叉编译器的执行仍然需要一些本地支撑软件包&#xff0c;可使用以下命令安装&#xff1a; $ sudo apt-get install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bis…...

【MMKV】HarmonyOS中的优秀轻量化存储方式

MMKV 引言 在移动应用开发的世界里&#xff0c;数据存储和管理是至关重要的一环。随着技术的不断进步&#xff0c;开发者们对于高性能、轻量级、易用的数据存储解决方案的需求日益增长。MMKV&#xff08;Memory Mapped Key-Value&#xff09;正是这样一个开源的高性能key-val…...

docker安装hadoop环境

一、使用docker搭建基础镜像 1、拉取centos系统镜像 # 我这里使用centos7为例子 docker pull centos:7 2、创建一个dockerfiler文件&#xff0c;用来构建自定义一个有ssh功能的centos镜像 # 基础镜像 FROM centos:7 # 作者 #MAINTAINER hadoop ADD Centos-7.repo /etc/yum.re…...

开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4

目录 一、FFmpeg是什么二、安装FFmpeg&#xff08;windows&#xff09;三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具&#xff0c;它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...

算法刷题Day5: BM52 数组中只出现一次的两个数字

描述&#xff1a; 一个整型数组里除了两个数字只出现一次&#xff0c;其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 要求&#xff1a;空间复杂度 O(1)&#xff0c;时间复杂度O(n)。 题目传送门 is here 思路&#xff1a; 方法一&#xff1a;最简单的思路就…...

55 基于单片机的方波频率可调

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 采用STC89C52单片机最小系统&#xff0c;设计DAC0832、放大器、与示波器显示方波&#xff0c;四位数码管显示频率&#xff0c;两个按键可调。 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROT…...

23.useUnload

在 Web 应用开发中,处理页面卸载(unload)事件是一个重要但常常被忽视的方面。无论是提醒用户保存未保存的更改,还是执行一些清理操作,都需要在用户即将离开页面时进行处理。useUnload 钩子提供了一种简洁的方式来在 React 组件中处理 beforeunload 事件,使得在用户试图关…...

linux环境搭建

1、**连接外网** ssh在192.168.4.x上运行sudo ip link set ens160 down ssh切换到192.168.3.x(外网ip)&#xff0c;运行sudo ip route add default via 192.168.2.1 dev ens192 onlink //连接外网 使用完外网后 ssh在192.168.3.x上运行sudo ip link set ens160 up ssh在1…...

《C++与生物医学的智能融合:医疗变革新引擎》

在当今科技飞速发展的时代&#xff0c;人工智能正以前所未有的深度和广度渗透到各个领域&#xff0c;为传统行业带来革新与突破。其中&#xff0c;将 C与生物学、医学等领域知识相结合&#xff0c;开发用于处理生物医学数据、辅助疾病诊断和治疗的人工智能应用&#xff0c;成为…...

LeRobot框架深度解析:3个核心模块实现机器人学习的PyTorch统一解决方案

LeRobot框架深度解析&#xff1a;3个核心模块实现机器人学习的PyTorch统一解决方案 【免费下载链接】lerobot &#x1f917; LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot …...

步进电机发热严重?4相5线电机停转保护的3个关键细节

步进电机发热严重&#xff1f;4相5线电机停转保护的3个关键细节 最近在调试一个自动化设备时&#xff0c;遇到了4相5线步进电机异常发热的问题。电机在运行半小时后表面温度竟达到60℃以上&#xff0c;这不仅影响设备寿命&#xff0c;还可能导致驱动芯片损坏。经过反复测试和排…...

OpenClaw+Qwen3.5-9B:3步搭建自动化内容审核系统

OpenClawQwen3.5-9B&#xff1a;3步搭建自动化内容审核系统 1. 为什么选择OpenClaw做内容审核&#xff1f; 去年运营一个技术社区时&#xff0c;我每天要花2小时手动审核用户提交的内容。直到发现OpenClaw这个开源自动化框架&#xff0c;配合Qwen3.5-9B的多模态能力&#xff…...

ChatTTS合成速度优化实战:从音频流处理到并行计算

最近在项目中用到了ChatTTS进行语音合成&#xff0c;效果确实不错&#xff0c;但遇到一个很实际的问题&#xff1a;合成速度太慢&#xff0c;尤其是处理长文本时&#xff0c;等待时间让人有点抓狂。于是花了一些时间研究优化方案&#xff0c;把整个探索过程和最终落地的方案记录…...

从半加器到四位加法器:在Intel Quartus里玩转模块化设计与层次化视图

从半加器到四位加法器&#xff1a;Intel Quartus中的模块化设计实战 引言 在数字电路设计的浩瀚宇宙中&#xff0c;加法器就像是最基础的原子结构&#xff0c;简单却蕴含着无限可能。作为一名FPGA开发者&#xff0c;我常常思考如何让设计既高效又优雅。记得第一次在Quartus中完…...

童年回忆杀!仿《燃烧的蔬菜》游戏完整源码 免费!!!

谁的童年没玩过《燃烧的蔬菜》&#xff01;这款经典的塔防休闲游戏&#xff0c;用蔬菜当炮弹击退怪物&#xff0c;治愈又解压。今天用PythonPygame复刻核心玩法&#xff0c;包含蔬菜发射、怪物生成、碰撞检测、计分系统&#xff0c;完整源码直接运行&#xff0c;带你重温童年&a…...

Win11 24H2新技巧:无需微软账户快速完成OOBE本地账户配置

1. Win11 24H2本地账户配置的现状与痛点 每次拿到新电脑或者重装系统时&#xff0c;最烦人的就是那个漫长的初始化设置过程。特别是Windows 11强制要求登录微软账户的设定&#xff0c;让很多注重隐私或者网络条件不好的用户头疼不已。我最近帮朋友配置了几台预装Win11 24H2的新…...

用Python处理SEED-VIG脑电数据:从PERCLOS标签到EEG特征提取的完整流程

用Python处理SEED-VIG脑电数据&#xff1a;从PERCLOS标签到EEG特征提取的完整流程 在神经工程和驾驶安全研究中&#xff0c;SEED-VIG数据集因其高质量的多模态生理信号采集而备受关注。这个包含EEG、EOG和眼动追踪数据的资源&#xff0c;为疲劳检测算法开发提供了宝贵素材。本文…...

Qwen3-32B-Chat镜像深度优化:OpenClaw任务执行效率提升30%

Qwen3-32B-Chat镜像深度优化&#xff1a;OpenClaw任务执行效率提升30% 1. 为什么需要深度优化&#xff1f; 去年冬天&#xff0c;当我第一次在本地部署OpenClaw对接Qwen3-32B模型时&#xff0c;遇到了一个尴尬的问题&#xff1a;一个简单的"截图识别鼠标点击"任务链…...

终极指南:深入解析 Evcxr 模块系统如何实现 Rust 代码隔离和状态管理

终极指南&#xff1a;深入解析 Evcxr 模块系统如何实现 Rust 代码隔离和状态管理 【免费下载链接】evcxr 项目地址: https://gitcode.com/gh_mirrors/ev/evcxr Evcxr 是一个为 Rust 语言设计的 eval() 实现&#xff0c;提供了强大的代码隔离和状态管理功能。这个 Rust …...