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

【JS 原型链】

JavaScript 原型链是一个重要的概念,它是 JavaScript 语言实现面向对象编程的核心。在 JavaScript 中,每个对象都有一个与之关联的原型,并且该对象继承了原型中的属性和方法。这些原型组成了一个原型链,可以通过该链追溯到顶层的 Object.prototype。

JavaScript 中的每个对象都有一个内部属性[[Prototype]],指向它的原型对象。如果该对象无法在自己的属性中找到一个属性或方法,它将查找与其关联的原型对象中的属性或方法。如果还是找不到,则会查找原型对象的原型,直到找到 Object.prototype,即顶层原型。这种机制被称为原型链。

例如,假设我们有这样一个对象:

let obj = {name: "Tom",age: 20
};

我们可以通过 Object.getPrototypeOf(obj) 来获取 obj 对象的原型,输出结果如下:

// {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}

可以看到,obj 对象的原型是 Object.prototype。如果我们访问 obj.toString() 方法,由于 obj 对象本身没有该方法,JavaScript 将会在原型链上查找该方法,找到 Object.prototype 上的 toString() 方法并执行。从而,实现了对 obj.toString() 方法的调用。

在 JavaScript 中,我们可以通过构造函数创建对象的实例。例如:

function Person(name) {this.name = name;
}
let p = new Person("Tom");

在这个例子中,我们首先定义了一个名为 Person 的构造函数,它有一个参数 name,用于接收人名。在实例化一个 Person 对象时,我们通过 new 操作符调用了该构造函数,并传递了一个参数 “Tom”。在这个过程中,JavaScript 会自动为新创建的对象设置一个原型,即 Person.prototype。我们可以通过 Object.getPrototypeOf§ 或 p.proto 访问该对象的原型。

当我们在实例 p 上访问属性时,如果 p 对象本身没有该属性,则会通过原型链查找该属性。例如,如果我们在 p 对象上访问 p.toString() 方法,由于 p 对象本身没有该方法,JavaScript 将会在原型链上查找该方法,找到 Person.prototype 上的 toString() 方法并执行。如果 Person.prototype 上也没有该方法,则会在原型链的上一级继续查找,即 Object.prototype 上查找该方法。如果还是找不到,则会返回 undefined。

在 JavaScript 中,我们可以通过给对象的原型对象添加属性和方法来实现继承。例如:

function Animal() {}
Animal.prototype.walk = function() {console.log("Animal is walking");
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {console.log("Dog is barking");
};
let d = new Dog();

在这个例子中,我们首先定义了一个名为 Animal 的构造函数,并在其原型对象上添加了一个 walk() 方法。然后,我们定义了一个名为 Dog 的构造函数,它通过 Object.create() 方法继承了 Animal.prototype,并在其原型对象上添加了一个 bark() 方法。最后,我们通过 new 操作符创建了一个 Dog 的实例 d。

在实例 d 上访问 walk() 和 bark() 方法时,如果 d 对象本身没有该方法,则会通过原型链查找该方法。如果在 Dog.prototype 和 Animal.prototype 上都找不到该方法,则会在 Object.prototype 上查找,如果还是找不到,则会返回 undefined。

总之,JavaScript 中的原型链是一个非常重要的概念,它是 JavaScript 实现面向对象编程的核心机制。通过构造函数和原型对象,我们可以轻松地创建对象的实例,并实现对象的继承。

相关文章:

【JS 原型链】

JavaScript 原型链是一个重要的概念,它是 JavaScript 语言实现面向对象编程的核心。在 JavaScript 中,每个对象都有一个与之关联的原型,并且该对象继承了原型中的属性和方法。这些原型组成了一个原型链,可以通过该链追溯到顶层的 …...

harmonyOS 开发之UI开发(ArkTS声明式开发范式)概述

UI开发(ArkTS声明式开发范式)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建OpenHarmony应用UI所必需的能力,主要包括: ArkTS ArkTS是UI开发语言&#xff…...

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…...

小程序新渲染引擎 Skyline 发布正式版

为了进一步提升小程序的渲染性能和体验,我们推出了一套新渲染引擎 Skyline,现在,跟随着基础库 3.0.0 发布 Skyline 正式版。 我们知道,小程序一直用 WebView 来渲染界面,因其有不错的兼容性和丰富的特性,且…...

网络安全作业1

URL编码 当 URL 路径或者查询参数中,带有中文或者特殊字符的时候,就需要对 URL 进行编码(采用十六进制编码格式)。URL 编码的原则是使用安全字符去表示那些不安全的字符。 安全字符,指的是没有特殊用途或者特殊意义的…...

【NLP】视觉变压器与卷积神经网络

一、说明 本篇是 变压器因其计算效率和可扩展性而成为NLP的首选模型。在计算机视觉中,卷积神经网络(CNN)架构仍然占主导地位,但一些研究人员已经尝试将CNN与自我注意相结合。作者尝试将标准变压器直接应用于图像,发现在…...

【redis】通过配置文件简述redis的rdb和aof

redis的持久化方式有2种,rdb,即通过快照的方式将全量数据以二进制记录在磁盘中,aof,仅追加文件,将增量的写命令追加在aof文件中。在恢复的时候,rdb要更快,但是会丢失一部分数据。aof丢失数据极少…...

Cypress 上传 pdf 变空白页问题

在使用cypress 上传文件时,上传正常,但是,pdf一直空白的,翻边了资料也没找到原因。最后在一个不起眼的地方发现了问题所在。 错误的代码: cy.fixture(CBKS.pdf).as(uploadFile)cy.get(.el-upload-dragger).selectFile…...

【ArcGIS Pro二次开发】(52):布局导出图片(批量)

在ArcGIS Pro中设定好布局后,可以直接导出为各种类型的图片。 这是很基本的功能,但是如果你的布局很多,一张一张导图就有点费劲。 之前有网友提出希望可以批量导图,要实现起来并不难,于是就做了这个工具。 一、要实现…...

Git拉取远程分支并创建本地分支

一、查看远程分支 使用如下git命令查看所有远程分支: git branch -r 查看远程和本地所有分支: git branch -a 查看本地分支: git branch 在输出结果中,前面带* 的是当前分支。 二、拉取远程分支并创建本地分支 方法一 使用…...

OSI七层模型——物理层

OSI模型的物理层位于协议栈的底部。它是 TCP/IP 模型的网络接入层的一部分。如果没有物理层,就没有网络。本模块详细介绍了连接到物理层的三种方法。 1 物理层的用途 1.1 物理连接 不管是在家连接本地打印机还是将其连接到另一国家/地区的网站上,在进…...

【NLP】使用变压器(tranformer)和自动编码器

一、说明 自然语言处理 (NLP)中,trnsformer和编码器是至关重要的概念;本篇不是探讨原理,而是讲现实中,如何调用和使用transformer以及encoder,注意。本文中有时出现“变压器”,那是transormer的同义词,在此事先声明。 二、NLP及其重要性的简要概述 NLP是人工…...

广州华锐互动:水利数字孪生智能管理系统的特色

水利数字孪生智能管理系统是一种基于数字孪生的新型水利管理工具,它通过将现实世界中的水利设施和设备数字化,并在虚拟环境中进行模拟和分析,为水利管理者提供更加直观、精准的决策支持。该系统具有以下亮点: 首先,水利…...

php使用chatGPT生成一些东西做一个记录

好久没写了,这么长时间都去坐一些自己感兴趣的事情去了。 之前使用chatgpt-3,效果一直不咋好,这里我们来说说各个版本区别 gpt-3收费成本可以接受,生成的内容对话有点不太聪明的样子 git-3.5-turbo收费相对来说低,生成文本质量…...

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具,采用拖拽式设计模式,不需任何服务器和组件支持,即可在 Mac、Linux 和 Windows 操作系统中,设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…...

听GPT 讲K8s源代码--pkg(七)

k8s项目中 pkg/kubelet/config,pkg/kubelet/configmap,pkg/kubelet/container,pkg/kubelet/cri 这几个目录处理与 kubelet 配置、ConfigMap、容器管理和容器运行时交互相关的功能。它们共同构成了 kubelet 的核心功能,使其能够在 …...

STM32MP157驱动开发——按键驱动(线程化处理)

文章目录 “线程化处理”机制:内核函数线程化处理方式的按键驱动程序(stm32mp157)编程思路button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “线程化处理”机制: 工作队列是在内核的线程的上下文中执行的 工作队列中有多个 work&#xff0…...

探究HTTP代理爬虫的反爬虫策略

在当前信息爆炸的时代,海量的数据成为了企业发展和决策的关键资源。然而,越来越多的网站为了保护数据和用户隐私的安全,采取了各种反爬虫策略。作为一家专业的HTTP代理产品供应商,我们一直在研究和优化反爬虫策略,为用…...

短视频去水印小程序,一键部署你的小程序,可开流量主,实现睡后收入

插件地址 短视频去水印小程序,一键部署你的小程序,可开流量主,实现睡后收入 插件说明 本插件包含以下两部分: 短视频去水印插件,仅为一个接口,可以集成到自己的任意程序中。短视频去水印插件配套小程序…...

通讯录系统

目录 通讯录系统头文件&#xff1a; 通讯录系统Test&#xff1a; 通讯录系统函数源代码&#xff1a; 通讯录系统头文件&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...