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

【前端八股文面试题】【JavaScript篇7】什么是JavaScript的原型、原型链? 有什么特点

文章目录

      • 一、原型(Prototype)
      • 二、原型链(Prototype Chain)
      • 三、核心特点
      • 四、原型 vs 类(ES6 class)
      • 总结

JavaScript的原型(Prototype)和原型链(Prototype Chain)是理解其面向对象特性的核心机制,也是实现继承的基础。以下是详细的解释和特点:


一、原型(Prototype)

  1. 定义

    • 每个 函数 都有一个特殊的属性 prototype(显式原型)。
    • prototype 是一个对象,用于存储该构造函数创建的实例共享的属性和方法。
    • 例如:
      function Person(name) {this.name = name;
      }
      // 向原型添加共享方法
      Person.prototype.sayHello = function() {console.log(`Hello, I'm ${this.name}`);
      };
      
  2. 关键点

    • 构造函数prototype 属性指向其原型对象。
    • 实例对象通过 __proto__(隐式原型,非标准属性)或 Object.getPrototypeOf() 访问原型。
    • 原型对象中默认包含 constructor 属性,指回构造函数本身(如 Person.prototype.constructor === Person)。

二、原型链(Prototype Chain)

  1. 定义

    • 当访问一个对象的属性或方法时:
      • 先在该对象自身查找。
      • 找不到则通过 __proto__ 查找其原型。
      • 若原型中仍找不到,则继续向原型的原型查找(即原型链层层向上)。
      • 直到找到属性或到达顶层原型(Object.prototype.__proto__ === null)。
  2. 结构示例

    const john = new Person("John");
    

    原型链关系:

    john → Person.prototype → Object.prototype → null
    
    • john.sayHello() 调用流程:
      • john 自身无 sayHello → 通过 john.__proto__ 找到 Person.prototype.sayHello
    • john.toString() 调用流程:
      • johnPerson.prototype 均无 toString → 最终在 Object.prototype 中找到。

三、核心特点

  1. 动态性

    • 原型对象上的修改实时生效,所有实例均可立即访问。
    Person.prototype.age = 30;
    console.log(john.age); // 30(即使john是之前创建的)
    
  2. 共享性

    • 原型上的属性和方法被所有实例共享,节省内存。
    • 引用类型属性(如数组)的修改会跨实例共享(需谨慎):
      Person.prototype.hobbies = [];
      john.hobbies.push("Coding");
      const alice = new Person("Alice");
      console.log(alice.hobbies); // ["Coding"](所有实例共享同一数组)
      
  3. 继承机制

    • 通过原型链实现对象之间的继承关系。
      function Student(grade) {this.grade = grade;
      }
      // 继承Person的原型
      Student.prototype = Object.create(Person.prototype);
      Student.prototype.constructor = Student; // 修复constructor指向
      
  4. 原型链终点

    • 所有原型链的终点是 Object.prototype(其 __proto__null)。
    • 内置方法(如 toString()hasOwnProperty())均定义于此。
  5. 性能注意

    • 过长的原型链(如多层继承)会降低属性查找效率。
    • 可通过 hasOwnProperty() 区分自身属性和继承属性。

四、原型 vs 类(ES6 class)

  • class 语法是原型的语法糖,底层仍基于原型链。
  • class 中的 extendssuper 本质是原型继承的封装:
    class Student extends Person {constructor(name, grade) {super(name); // 调用父类构造函数this.grade = grade;}
    }
    

总结

概念作用访问方式
原型存储构造函数共享的属性和方法Constructor.prototype
原型链通过 __proto__ 实现属性查找的链式结构obj.__proto__(或 Object.getPrototypeOf(obj)
顶层原型Object.prototype,含内置方法Object.prototype.__proto__ === null

理解原型和原型链是掌握JavaScript继承、类实现、设计模式的关键。

http://www.dtcms.com/a/327370.html

相关文章:

  • 【设计模式精解】Java实现责任链模式(职责链模式)优雅处理多级请求(概述,使用场景,优缺点,代码示例)
  • Rust:构造函数 new() 如何进行错误处理?
  • 信号(Signal)** 是一种进程间异步通信机制,用于通知进程发生发生了某种事件(如错误、用户中断等)
  • 疯狂星期四文案网第37天运营日记
  • Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
  • 通过限制对象的内存分配位置来实现特定的设计目标
  • 【数据结构入门】堆
  • powerbi本地报表发布到web,以得到分享链接
  • C99中的变长数组(VLA)
  • 什么是 Spring MVC?
  • 中扬立库与西门子深化技术协同 共绘智能仓储创新蓝图
  • clean install 和 clean package 的区别
  • JVM学习笔记-----图解方法执行流程
  • 百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行
  • 【力扣494】目标和
  • 【软考中级网络工程师】知识点之 IP QoS 技术
  • JVM宝典
  • 面试八股之从Java到JVM层面深入解析ReentrantLock实现原理
  • 力扣top100(day01-05)--矩阵
  • 开放原子开源生态大会:麒麟信安加入openEuler社区AI联合工作组,聚焦操作系统开源实践与行业赋能
  • Linux下的软件编程——文件IO
  • Openlayers基础教程|从前端框架到GIS开发系列课程(24)openlayers结合canva绘制矩形绘制线
  • 循环神经网络
  • THCV215一种高速视频数据收发器,采用低电压差分信号(LVDS)技术支持高速串行数据传输,支持1080p/60Hz高分辨率传输
  • 【[特殊字符][特殊字符] 协变与逆变:用“动物收容所”讲清楚 PHP 类型的“灵活继承”】
  • Gradle(二)Gradle的优势、项目结构介绍
  • 电商双11美妆数据分析(一)
  • Honeywell霍尼韦尔A205压力传感器HC41H106P060169419G固瑞克117764美国制造
  • Rust 项目编译故障排查:从 ‘onnxruntime‘ 链接失败到 ‘#![feature]‘ 工具链不兼容错误
  • KAQG:一种用于生成难度可控问题的知识图谱的增强的RAG系统(论文大白话)