【js面试题】js原型,原型链?有什么特点

news2024/9/21 4:29:25

在 JavaScript 中,原型(Prototype)和原型链(Prototype Chain)是实现继承和共享属性与方法的核心机制。理解它们对于深入掌握 JavaScript 的对象模型非常重要。

原型(Prototype)

每个 JavaScript 对象都拥有一个原型对象,它包含可以由该对象的所有实例共享的属性和方法。原型对象自身也有一个原型,层层上溯,直到达到 null,形成一个“原型链”。

特点:
  1. 共享属性和方法:对象的原型允许不同实例共享相同的属性和方法,减少内存占用。
  2. 动态性:JavaScript 的原型是动态的,即使原型对象在创建实例之后被修改,实例也会反映这些变化。
  3. 继承:通过原型链,JavaScript 实现了基于原型的继承机制。
    在这里插入图片描述

示例:

// 定义一个构造函数
function Car(make, model) {
    this.make = make;
    this.model = model;
}

// 使用原型添加一个方法,所有 Car 实例都会共享这个方法
Car.prototype.displayInfo = function() {
    console.log(`This car is a ${this.make} ${this.model}.`);
};

// 创建两个 Car 实例
let car1 = new Car('Toyota', 'Corolla');
let car2 = new Car('Ford', 'Mustang');

// 调用原型上的方法
car1.displayInfo(); // 输出: This car is a Toyota Corolla.
car2.displayInfo(); // 输出: This car is a Ford Mustang.

//使用 hasOwnProperty 方法检查 displayInfo 是否为 car1 的自有属性
console.log(car1.hasOwnProperty('displayInfo')); // 输出: false,因为 displayInfo 是原型上的方法

原型链(Prototype Chain)

原型链是连接对象和其原型的链表结构,它从对象开始,逐级向上直到 Object.prototype,最终达到 null

特点:
  1. 属性查找:当访问一个对象的属性时,JavaScript 会首先在对象本身上查找,如果没有找到,会沿着原型链向上查找,直到找到该属性或到达链的末端。
  2. 继承:通过原型链,子对象可以继承父对象的属性和方法。

用例

让我们通过一个例子来理解原型链的概念。我们将创建几个对象,并通过原型链实现继承。

// 定义一个基础构造函数
function Animal(name) {
    this.name = name;
}

// 为 Animal 的原型添加一个方法
Animal.prototype.speak = function() {
    console.log(`${this.name} makes a noise.`);
};

// 定义一个继承自 Animal 的构造函数
function Dog(name, breed) {
    // 调用父构造函数,实现属性继承
    Animal.call(this, name);
    this.breed = breed;
}

// 设置 Dog 的原型为 Animal 的一个实例,实现方法继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修正构造函数指向

// 为 Dog 添加特有的方法
Dog.prototype.bark = function() {
    console.log(`${this.name} barks.`);
};

// 创建一个 Dog 实例
let myDog = new Dog('Rex', 'Labrador');

// 调用继承自 Animal 的方法
myDog.speak(); // 输出: Rex makes a noise.

// 调用 Dog 自己的方法
myDog.bark(); // 输出: Rex barks.

// 检查原型链
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Dog); // true
console.log(myDog instanceof Object); // true

解释

  1. 基础构造函数 Animal:定义了一个 Animal 构造函数和一个原型方法 speak
  2. 派生构造函数 Dog:定义了一个 Dog 构造函数,它继承自 Animal。使用 Animal.call(this, name) 来调用父构造函数,确保 Dog 实例拥有 Animal 的属性。
  3. 设置原型链:通过 Dog.prototype = Object.create(Animal.prototype),我们创建了一个新的对象,其原型是 Animal.prototype。这样,Dog 的实例就可以访问 Animal 原型上的方法了。同时,我们修正了 Dog.prototype.constructor 以指向 Dog 构造函数。
  4. 添加特有方法:为 Dog 添加了一个特有的方法 bark
  5. 创建实例并调用方法:创建了一个 Dog 的实例 myDog,并调用了继承自 Animalspeak 方法和 Dog 自己的 bark 方法。
  6. 检查原型链:通过 instanceof 操作符,我们可以看到 myDogAnimalDogObject 的实例,这说明了原型链的继承关系。

在这里插入图片描述

使用场景

  • 共享方法:当你希望多个对象共享同一个方法或属性时,可以将它们放在原型上。
  • 实现继承:通过修改或扩展对象的原型,可以实现继承机制,允许子对象访问父对象的方法和属性。
  • 检测属性来源:当需要确定一个属性是对象自身的还是继承自原型链时,可以使用 hasOwnProperty 方法。

总结

原型和原型链是 JavaScript 中实现对象继承和属性共享的核心机制。通过原型链,对象可以继承其构造函数的原型对象上的属性和方法。理解原型链对于编写高效且可维护的 JavaScript 代码至关重要。在实际开发中,合理利用原型和原型链可以优化内存使用,实现复杂的继承结构,并且有助于深入理解 JavaScript 的对象模型。

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

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

相关文章

24年上半年天融信营收缩减1.8亿,亏损2.06亿

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

建筑三剑客:平面、剖面与立面图解析

平面图、剖面图与立面图是建筑学中不可或缺的工具,它们共同构成了建筑设计的基础。平面图展示了建筑物的顶部视图,详细标出了房间布局和空间关系。剖面图则揭示了建筑的内部结构,包括楼层分布和垂直交通。而立面图呈现了建筑的外观&#xff0…

【学习笔记】Matlab和python双语言的学习(一元线性回归)

文章目录 前言一、一元线性回归回归分析的一般步骤一元线性回归的基本形式回归方程参数的最小二乘法估计对回归方程的各种检验估计标准误差的计算回归直线的拟合优度判定系数显著性检验 二、示例三、代码实现----Matlab四、代码实现----python回归系数的置信区间公式残差的置信…

入门MySQL数据库

目录 一、MySQL的安装(以5.7版本为例) 1. 一路默认安装即可,注意root密码。 2.配置环境变量 3.登录数据库 二、指令 1.数据库 2.数据表 3.约束 4.增删改查 1>查 2>增 3>改 4>删 5.数据库用户 6.外键 1>创建添加外…

实验5:数码管实验,51单片机

8个数码管 LED1-LED8分别有P22,P23,P24的A,B,C控制 C B A 000 0-1 001 1-2 010 2-3 011 3-4 101 4-5 110 6-7 111 7-8 共阴极数码管,八段 0-F编码 硬件图 对应P0口 main.c #include<reg52.h>typedef unsigned int u16; typedef unsigned char u8;#d…

RPA在政务领域的发展前景

随着信息技术的迅猛发展&#xff0c;政务领域也在不断探索创新&#xff0c;以提升政府服务的质量和效率。RPA作为一种自动化技术&#xff0c;打破了传统政务服务人工操作的局限&#xff0c;协助基层人员更高效准确地完成录入、审查、校对和数据汇总等各项繁琐的工作&#xff0c…

第1节 安装Flask

我们以Thonny4为例&#xff1a; flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现。 一、找到你的安装目录 这是我的安装目录&#xff1a; D:\thonney4\scripts 二、执行pip pip install Flask

LabVIEW VI 多语言动态加载与运行的实现

在多语言应用程序开发中&#xff0c;确保用户界面能够根据用户的语言偏好动态切换是一个关键需求。本文通过分析一个LabVIEW程序框图&#xff0c;详细说明了如何使用LabVIEW中的属性节点和调用节点来实现VI&#xff08;虚拟仪器&#xff09;界面语言的动态加载与运行。此程序允…

人像修复-DB双曲线

相对于中性灰图层修复&#xff0c;不容易掉色&#xff0c;光影过渡更均匀&#xff0c;适合大范围调整光影&#xff0c;而中性灰适合更调整细节主要用于修饰光影均匀过渡&#xff0c;先大范围修饰整体&#xff0c;再局部细节修饰 建立明度观察层&#xff08;渐变映射曲线&#x…

Xilinx系ZYNQ学习笔记(二)ZYNQ入门

系列文章目录 文章目录 系列文章目录前言简单介绍简称 xc7z020型号FPGAZYNQ实操通用IO点亮LED灯硬件逻辑基础 前言 简单入门一下ZYNQ是何种架构&#xff0c;如何编程&#xff0c;至于深入了解应该要分开深入学习Linux和FPGA 简单介绍 其基本架构都是在同一个硅片上集成 FPGA …

『Android』如何配置 Jetpack-Compose 环境

记录配置Jetpack Compose环境的一些坑~ 直接创建kotlin项目或创建java项目后再配置均可 根目录 build.gradle 配置kotlin环境构建脚本 buildscript {ext.kotlin_version 1.4.32dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&q…

T5:运动鞋图片识别

T5周&#xff1a;运动鞋品牌识别 **一、前期工作**1.设置GPU&#xff08;用CPU可忽略该步骤&#xff09;2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****1、设置动态学习率** **五、训练模型****六、模…

【iOS】——响应者链和事件传递链

事件传递 事件传递流程 发生触摸事件后&#xff0c;系统会将该事件封装成UIEvent对象加入到一个由UIApplication管理的事件队列 UIApplication会从事件队列中取出最前面的事件&#xff0c;并将事件分发下去以便处理&#xff0c;通常&#xff0c;先发送事件给应用程序的主窗口…

什么你还不懂keepalived高可用负载均衡架构?

1、部署keepalived 1.1、keepalived简介 vrrp 协议的软件实现,原生设计目的为了高可用 ipvs 服务 官网: http://keepalived.org/ 功能: 基于 vrrp 协议完成地址流动 为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 ) 为 ipvs 集群的各 RS 做健康状态检测 基…

Linux 操作系统 --- 信号

序言 在本篇内容中&#xff0c;将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑&#xff0c;好像我在使用 Linux 的过程中并没有接触过信号&#xff0c;这是啥呀&#xff1f;其实我们经常遇到过&#xff0c;当我们运行的进程当进程尝试访问非法内存地址时…

NC 数组中只出现一次的两个数字

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 一个整型数组…

Apache--简介与基本使用

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Apache简介 Apache HTTP Server&#xff08;在Red Hat发行版中俗称Apache或httpd&#xff09;是由Apache Software Foundation在Apache License…

windows bat脚本基础指令详解

pause暂停批处理的执行并在屏幕上显示"请按任意键继续…"echo显示指令&#xff0c;会把需要显示的内容展示出来。echo off在此语句后所有运行的命令都不显示命令行本身&#xff0c;但是本身的指令是会显示出来的。不显示本行命令行call调用另一个批处理文件&#xff…

Ricardo Milos

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <form id"ricardo" method"GET"><input name"milos" type"text" class"form-control" placeholder"True" va…

【C++STL详解(十一)】map/set/multimap/multiset的介绍与使用

目录 一、关联式容器 二、键值对 三、set 介绍 简单使用 1.构造 2.相关迭代器 3.容量 4.修改 四、multiset 五、map 介绍 使用 1.定义的方式 2.迭代器相关 3.容量与operator【】(重点) 4.修改 小总结&#xff1a; 六、multimap 一、关联式容器 在CSTL中…