什么是JavaScript原型链?

embedded/2024/11/24 11:32:13/

原型链(Prototype Chain)是JavaScript中面向对象编程的一个核心概念,它定义了对象之间的层次关系和属性查找机制。在JavaScript中,每个对象都有一个[[Prototype]]属性(内部属性),这个属性指向其原型对象。当访问对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript引擎就会沿着原型链向上查找,直到找到该属性或方法或者到达原型链的末端(即Object.prototype的原型是null)。

原型链的组成:

  1. 每个对象都有原型:当创建一个对象时,如果没有指定构造函数的prototype属性,那么该对象的原型默认是Object.prototype

  2. 构造函数的prototype属性:每个函数都有一个prototype属性,它是一个对象,这个对象的所有实例(通过这个函数创建的对象)都将继承它。

  3. Object.prototype:所有使用new Object()或直接创建的对象(如字面量创建的对象)都会继承Object.prototype

  4. 原型链的顶端Object.prototype的原型是null,标志着原型链的末端。

如何访问原型:

在JavaScript中,可以使用__proto__(非标准,但广泛支持)或Object.getPrototypeOf()(标准方法)来访问一个对象的原型。

原型链的查找过程:

当你尝试访问一个对象的属性或方法时,以下查找过程会发生:

  1. 首先检查对象自身是否包含该属性或方法。
  2. 如果对象自身没有该属性或方法,JavaScript引擎会沿着原型链向上查找该属性或方法。
  3. 如果找到了对应的属性或方法,就直接返回该值。
  4. 如果到达原型链的末端(Object.prototype)仍未找到,那么返回undefined

原型链与继承:

原型链也是JavaScript实现继承的一种方式。当你创建一个对象时,它会自动继承其原型对象的属性和方法。这种继承方式使得JavaScript中的类可以更轻量级,因为不需要每个子类都复制一份父类的代码,只需继承父类的原型即可。

示例:

javascript">function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {return "Hello, my name is " + this.name;
};var person = new Person("Alice");// 通过原型链访问
console.log(person.sayHello()); // 输出: Hello, my name is Alice
console.log(person.__proto__ === Person.prototype); // 输出: true
console.log(Person.prototype.__proto__ === Object.prototype); // 输出: true

在这个例子中,person对象继承自Person.prototype,而Person.prototype又继承自Object.prototype。这使得person可以访问sayHello方法。


http://www.ppmy.cn/embedded/140112.html

相关文章

java excel 导入各种踩坑

在 Java 中处理 Excel 导入时,常见的问题(即“踩坑”)很多,下面列举了处理 Excel 导入时可能遇到的一些问题,并给出了解决方案和优化技巧。 1. POI 库与版本问题 Apache POI 是处理 Excel 的常用库,但是不…

解决Excel文件流读取数字为时间乱码问题

在将Excel文件流转换为Java中的List时,如果遇到文本被错误地识别为日期格式的问题,这通常是由于Apache POI库在处理单元格数据时默认的行为所导致的。Apache POI会尝试根据单元格的内容自动确定其类型,包括字符串、数字(可能解释为…

安卓手机5G网络频繁掉4G 问题解决 手机5G网络优化方案

问题环境 在某个长期停留的位置(例如:躺平)使用手机时网络突然从5G跳到4G,偶尔跳来跳去导致网络体验很差,经过调整5G网络情况下网速及其他体验都要更好,基于这样的情况使用一种简单的操作,锁定5…

面向服务的软件工程——面向过程的系统分析:流程挖掘(week10)

文章目录 一、前言二、重点概念面向过程的系统分析:流程挖掘流程挖掘概述流程挖掘与数据科学的关系流程挖掘中的关键问题关于流程挖掘的常见误解应用场景流程挖掘的总体概述流程挖掘的三个技术场景流程挖掘的起点:日志数据流程挖掘中的一些符号日志条目示例事件日志的通用结构…

JMeter监听器与压测监控之Grafana

Grafana 是一个开源的度量分析和可视化套件,通常用于监控和观察系统和应用的性能。本文将指导你如何在 Kali Linux 上使用 Docker 来部署 Grafana 性能监控平台。 前提条件 Kali Linux:确保你已经安装了 Kali Linux。Docker:确保你的系统已…

02. Python基础知识

一、注释 在开发程序过程中,如果一段代码的逻辑比较复杂,不是特别容易理解,可以适当添加注释,以辅助自己或其他开发人员解读代码。注释是给程序员看的,为了让程序员方便阅读代码,解释器会忽略注释。在 Pyto…

多模态大模型(5)--LLaVA

人类通过如视觉、语言、听觉等多种渠道与世界互动,每个单独的渠道在表示和传达某些概念时都有其独特的优势,人工智能(AI)的一个核心愿景是开发一个能够有效遵循多模态视觉和语言指令的通用助手,与人类意图一致&#xf…

C++ 中的模板特化和偏特化 如何进行模板特化和偏特化

模板特化和偏特化的概念 模板特化(Template Specialization) 概念:模板特化是指为特定的模板参数(或参数组合)提供一个特殊的实现。当编译器在实例化模板时,如果遇到与特化版本匹配的参数类型,就…