深入理解JavaScript原型_面向对象编程实践

JavaScript的面向对象基于原型而非类,ES6的class是语法糖,底层仍用原型链实现继承。对象通过__proto__指向原型,查找属性时沿原型链向上追溯。函数的prototype属性被实例继承,new操作生成的对象原型指向构造函数的prototype。继承通过Object.create(父类.prototype)实现,子类原型链连接到父类,同时需修正constructor指向。class语法更简洁,但extends本质仍是原型链继承,掌握原型机制才能深入理解JavaScript对象模型。

深入理解javascript原型_面向对象编程实践

JavaScript的面向对象机制和其他语言如Java或C++不同,它基于原型(prototype)而非类(class)来实现对象的继承与扩展。虽然ES6引入了class关键字,但这只是语法糖,底层依然是原型系统。理解原型是掌握JavaScript面向对象编程的关键。

原型与原型链:对象如何共享属性和方法

每个JavaScript对象都有一个内部链接指向另一个对象,这个对象就是它的原型。当访问一个对象的属性时,如果该对象本身没有这个属性,引擎会自动查找其原型对象,这个过程一直持续到原型链的末端——通常是Object.prototype,最终返回null。

函数在JavaScript中是一等公民,而每个函数都有一个prototype属性,这个属性是一个对象,包含可以被实例继承的属性和方法。使用new操作符调用函数时,新创建的对象的原型就会指向该函数的prototype。

例如:

立即学习“Java免费学习笔记(深入)”;

function Person(name) {  this.name = name;}Person.prototype.greet = function() {  console.log("Hello, I'm " + this.name);};const john = new Person("John");john.greet(); // 输出: Hello, I'm John

这里,john本身没有greet方法,但它能调用,是因为它通过原型链找到了Person.prototype上的定义。

构造函数、实例与原型的关系

理解构造函数.prototype、实例.__proto__和Object.getPrototypeOf()之间的关系至关重要。

Person.prototype 是构造函数的原型对象,用于为所有实例提供共享方法。 john.__proto__ 指向Person.prototype,这是实例访问原型的标准方式(不推荐直接使用__proto__,应使用Object.getPrototypeOf(john))。 Person.prototype.constructor 默认指向Person函数本身。

可以通过以下代码验证:

Veed AI Voice Generator Veed AI Voice Generator

Veed推出的AI语音生成器

Veed AI Voice Generator 77 查看详情 Veed AI Voice Generator

console.log(john.__proto__ === Person.prototype); // trueconsole.log(Object.getPrototypeOf(john) === Person.prototype); // trueconsole.log(Person.prototype.constructor === Person); // true

利用原型实现继承

JavaScript中的继承通常通过“原型链”实现。子类的原型设置为父类的一个实例,从而让子类实例能够访问父类的方法和属性。

基本模式如下:

function Animal(name) {  this.name = name;}Animal.prototype.speak = function() {  console.log(this.name + " makes a sound.");};function Dog(name, breed) {  Animal.call(this, name); // 调用父类构造函数  this.breed = breed;}// 建立原型链Dog.prototype = Object.create(Animal.prototype);Dog.prototype.constructor = Dog;Dog.prototype.bark = function() {  console.log(this.name + " barks!");};const dog = new Dog("Rex", "German Shepherd");dog.speak(); // Rex makes a sound.dog.bark();  // Rex barks!

关键点在于使用Object.create(Animal.prototype)来设置Dog.prototype,这样既继承了方法,又不会执行Animal的构造函数逻辑。同时要手动恢复constructor指向,避免后续出错。

现代实践:class语法与底层原型的一致性

ES6的class语法让代码更清晰,但本质不变:

class Animal {  constructor(name) {    this.name = name;  }  speak() {    console.log(this.name + " makes a sound.");  }}class Dog extends Animal {  constructor(name, breed) {    super(name);    this.breed = breed;  }  bark() {    console.log(this.name + " barks!");  }}

这段代码与前面的原型写法功能一致。extends背后仍然是通过原型链连接Dog.prototype到Animal.prototype。使用class并不会改变JavaScript的原型机制,只是提供了更直观的语法。

基本上就这些。掌握原型,你就能真正理解JavaScript的对象模型,无论是否使用class,都能写出高效、可维护的面向对象代码。

以上就是深入理解JavaScript原型_面向对象编程实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/863514.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
拼多多网页版在线使用 拼多多手机版官方链接
上一篇 2025年11月28日 00:49:38
php如何检测变量是否序列化_phpis_serialized判断与反序列化安全
下一篇 2025年11月28日 00:49:38

相关推荐

  • Java面向对象高级之多态与接口_Java实现面向对象编程的核心概念

    Java面向对象高级之多态与接口_Java实现面向对象编程的核心概念Java面向对象高级之多态与接口_Java实现面向对象编程的核心概念Java面向对象高级之多态与接口_Java实现面向对象编程的核心概念Java面向对象高级之多态与接口_Java实现面向对象编程的核心概念

    多态和接口是Java面向对象编程的核心,多态实现“一个接口,多种实现”,提升代码灵活性与扩展性;接口定义行为规范,支持多重能力,促进解耦与抽象;二者协同支持开闭原则,增强系统健壮性与可测试性,是构建高质量Java应用的设计基石。 多态和接口,在我看来,它们是Java面向对象编程(OOP)真正发挥其威…

    2026年9月30日 • 用户投稿
    000
  • Sublime宏变量使用 Sublime动态宏命令

    Sublime宏变量使用 Sublime动态宏命令Sublime宏变量使用 Sublime动态宏命令Sublime宏变量使用 Sublime动态宏命令Sublime宏变量使用 Sublime动态宏命令

    在sublime text中使用宏变量和动态宏命令需借助插件实现。1. 使用宏变量时,可通过sendtext等插件调用外部脚本处理选中文本或剪贴板内容,并将结果返回替换原内容,如批量修改markdown图片链接域名。2. 动态宏命令通过插件根据上下文生成不同命令序列,例如编写python插件分析代码…

    2026年9月30日 • 用户投稿
    000
  • windows提示“msvcr110.dll丢失”如何修复 msvcr110.dll丢失的修复方法

    windows提示“msvcr110.dll丢失”如何修复 msvcr110.dll丢失的修复方法windows提示“msvcr110.dll丢失”如何修复 msvcr110.dll丢失的修复方法windows提示“msvcr110.dll丢失”如何修复 msvcr110.dll丢失的修复方法windows提示“msvcr110.dll丢失”如何修复 msvcr110.dll丢失的修复方法

    msvcr110.dll丢失需修复Visual C++ 2012运行库,方法一:重新安装Microsoft Visual C++ 2012 Redistributable;方法二:使用SFC扫描修复系统文件;方法三:通过regsvr32手动注册dll;方法四:从可信源替换并注册dll;方法五:运行D…

    2026年9月30日 • 用户投稿
    100
  • Java递归实现最长回文子串的查找与修正

    本文探讨了使用递归方法查找字符串中最长回文子串的常见挑战与陷阱。通过分析一个常见的错误递归实现,文章指出了判断子串是否构成完整回文的关键逻辑缺陷,并提供了一个经过修正的递归算法,详细解释了其工作原理,旨在帮助读者正确理解和实现递归回文检测。 递归查找最长回文子串:问题背景 在计算机科学中,回文是一个…

    2026年9月30日
    000
  • ColorOS 16流畅技术前瞻,技术架构升级挑战流畅三大极限

    ColorOS 16流畅技术前瞻,技术架构升级挑战流畅三大极限ColorOS 16流畅技术前瞻,技术架构升级挑战流畅三大极限ColorOS 16流畅技术前瞻,技术架构升级挑战流畅三大极限ColorOS 16流畅技术前瞻,技术架构升级挑战流畅三大极限

    9月22日,oppo在深圳举行了一场关于系统流畅性的技术沟通会,提前揭晓了即将上线的coloros 16系统。此次发布的全新coloros 16在底层架构上实现全面革新,依托三大核心技术——全新极光引擎、全新潮汐引擎与全新繁星编译器,推动手机系统流畅体验迈入全新阶段,标志着coloros对极致顺滑操…

    2026年9月30日 • 用户投稿
    100
  • 怎么用豆包AI帮我生成HTTP客户端代码 HTTP客户端代码的AI生成指南

    怎么用豆包AI帮我生成HTTP客户端代码 HTTP客户端代码的AI生成指南怎么用豆包AI帮我生成HTTP客户端代码 HTTP客户端代码的AI生成指南怎么用豆包AI帮我生成HTTP客户端代码 HTTP客户端代码的AI生成指南怎么用豆包AI帮我生成HTTP客户端代码 HTTP客户端代码的AI生成指南

    使用豆包ai生成http客户端代码的关键在于提供清晰具体的指令。1. 明确请求方式和目标url,例如指定get或post请求及对应地址;2. 提供查询参数、请求头及认证信息,如token或headers;3. 指定编程语言及框架,如python的requests、node.js的axios等;4. …

    2026年9月30日 • 用户投稿
    100
  • 豆包AI编程功能介绍 豆包AI自动写代码步骤

    豆包AI编程功能介绍 豆包AI自动写代码步骤豆包AI编程功能介绍 豆包AI自动写代码步骤豆包AI编程功能介绍 豆包AI自动写代码步骤豆包AI编程功能介绍 豆包AI自动写代码步骤

    豆包的#%#$#%@%@%$#%$#%#%#$%@_4921c++0e2d1f6005abe1f9ec2e2041909编程功能具备代码生成、补全、注释添加、错误检查与修复建议等实用能力,支持多语言开发环境。1. 主要功能包括:根据自然语言生成代码、智能推荐下一行代码、自动生成注释、识别语法错误并提…

    2026年9月30日 • 用户投稿
    000
  • Linux下MySQL 8.0 二进制安装

    mysql社区版:开源且免费,但不提供技术支持,需搭配其他开源工具使用。 MySQL企业版:与社区版代码相同,通过插件提供额外功能,如线程插件、审计插件等。 MySQL Cluster CGE集群商业版:实时开源事务数据库,设计用于高吞吐量环境下快速、持久地访问数据。支持并行分布式查询引擎、自动分区…

    2026年9月30日
    100
  • Java自定义类方法链式调用实践:实现对象状态修改

    本文详细讲解了如何在Java自定义类中实现方法链式调用,以便在创建对象后立即对其状态进行修改。核心在于使修改对象状态的方法返回当前对象实例(this),从而允许连续调用多个方法,简化代码结构并提高可读性。文章通过具体示例代码,演示了如何构建支持链式调用的类方法,并探讨了其背后的原理和应用场景。 在J…

    2026年9月30日
    700
  • 如何使用Java的Optional防止空指针异常

    合理使用Optional可避免空指针异常,提升代码安全性和可读性。1. 用Optional.ofNullable封装可能为null的对象,如用户为空时姓名设为“未知用户”;2. 通过orElse提供默认值,高开销场景优先使用延迟加载的orElseGet;3. 利用map链式转换嵌套属性,自动规避中间…

    2026年9月30日
    100
  • sublime怎样进行代码注释美化 sublime注释格式化的插件技巧

    sublime怎样进行代码注释美化 sublime注释格式化的插件技巧sublime怎样进行代码注释美化 sublime注释格式化的插件技巧sublime怎样进行代码注释美化 sublime注释格式化的插件技巧sublime怎样进行代码注释美化 sublime注释格式化的插件技巧

    sublime text本身注释美化能力有限,主要依赖插件实现高级格式化;2. docblockr是核心插件,能智能生成结构化注释块,支持参数、返回值识别与文本对齐;3. 代码格式化工具如jsprettier和sublimeblack在统一代码风格的同时也规范注释缩进与换行,提升整体协调性;4. 注…

    2026年9月30日 • 用户投稿
    100
  • Java代码无报错但无法运行:二进制转十进制的常见陷阱与解决方案

    本文旨在帮助Java初学者解决代码无报错但无法正常运行的问题,特别是针对二进制转换为十进制的场景。通过分析常见错误原因,例如误用取余运算符,提供详细的调试方法和修正后的代码示例,帮助读者理解并掌握正确的二进制转换逻辑,避免程序进入死循环,确保代码的正确执行。 在Java编程中,有时会遇到代码没有报错…

    2026年9月30日
    100
  • Java程序流程控制之循环与分支_Java实现程序逻辑的基础语句

    Java程序流程控制之循环与分支_Java实现程序逻辑的基础语句Java程序流程控制之循环与分支_Java实现程序逻辑的基础语句Java程序流程控制之循环与分支_Java实现程序逻辑的基础语句Java程序流程控制之循环与分支_Java实现程序逻辑的基础语句

    Java中的循环和分支是程序实现逻辑控制的核心。分支语句(如if、if-else、switch)根据条件选择执行路径,其中if处理复杂条件,switch适用于单一变量的多值判断;循环语句(如for、while、do-while)实现重复执行,for用于已知次数或遍历,while在条件满足时执行(可能…

    2026年9月30日 • 用户投稿
    100
  • java怎样使用JVM参数配置运行环境 java虚拟机调优的入门技巧

    java怎样使用JVM参数配置运行环境 java虚拟机调优的入门技巧java怎样使用JVM参数配置运行环境 java虚拟机调优的入门技巧java怎样使用JVM参数配置运行环境 java虚拟机调优的入门技巧java怎样使用JVM参数配置运行环境 java虚拟机调优的入门技巧

    配置JVM运行环境需通过命令行参数设置内存、GC策略等,如-Xms512m -Xmx2g -XX:+UseG1GC,以优化资源利用率、响应速度与稳定性,避免OOM,提升应用性能。 配置Java虚拟机(JVM)运行环境以及进行初步调优,核心在于通过命令行参数来指导JVM如何分配和管理资源,以及选择合适…

    2026年9月30日 • 用户投稿
    100
  • 我的世界谜之炖菜怎么制作 谜之炖菜合成方法介绍

    我的世界谜之炖菜怎么制作 谜之炖菜合成方法介绍我的世界谜之炖菜怎么制作 谜之炖菜合成方法介绍我的世界谜之炖菜怎么制作 谜之炖菜合成方法介绍我的世界谜之炖菜怎么制作 谜之炖菜合成方法介绍

    我的世界谜之炖菜可通过红色蘑菇、棕色蘑菇、碗和任意小型花合成,也能通过多种途径获取,食用后恢复饥饿值和饱和度,还会获得对应花的状态效果,以下是详细的物品介绍。 我的世界谜之炖菜合成方法和特性介绍如下: 一、合成方法 需准备红色蘑菇、棕色蘑菇、碗和任意小型花,将这些材料在工作台合成即可获得谜之炖菜。 …

    2026年9月30日 • 用户投稿
    300
  • 大厂面试必考之Java集合原理_Java集合框架的底层实现与应用

    大厂面试必考之Java集合原理_Java集合框架的底层实现与应用大厂面试必考之Java集合原理_Java集合框架的底层实现与应用大厂面试必考之Java集合原理_Java集合框架的底层实现与应用大厂面试必考之Java集合原理_Java集合框架的底层实现与应用

    Java集合框架的核心是List、Set、Map三大接口。List有序可重复,常用实现ArrayList(数组实现,查询快)和LinkedList(链表实现,增删快);Set元素唯一,HashSet基于哈希表实现(查找快),TreeSet基于红黑树(有序);Map存储键值对,键唯一,HashMap(…

    2026年9月30日 • 用户投稿
    100
  • 将 XML Bean 定义迁移到 @Configuration 注解类

    将 XML Bean 定义迁移到 @Configuration 注解类 本文将指导您如何将 Spring 应用中基于 XML 的 JMS Bean 定义迁移到使用 @Configuration 注解的 Java 类中。通过示例,我们将展示如何使用 @Bean 注解创建 JmsTemplate 和 J…

    2026年9月30日
    100
  • Java中利用正则表达式实现字符串特定单词的忽略大小写替换

    本教程旨在解决如何在字符串中高效地将特定单词的所有大小写变体统一转换为指定大小写形式的问题。通过引入正则表达式的“大小写不敏感”匹配模式,我们能够避免为每种变体编写单独的替换规则,从而实现简洁、灵活且强大的字符串处理,显著提升代码效率和可维护性。 传统替换方法的局限性 在字符串处理中,我们经常会遇到…

    2026年9月30日
    100
  • 提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧

    提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧提升代码质量之Java枚举的正确用法_Java枚举类型的实战技巧

    Java枚举通过封装数据和行为,提供类型安全、避免魔法值,提升代码可读性与可维护性,如订单状态枚举可携带状态码、描述及处理逻辑,并支持策略模式,取代冗长if-else,实现清晰多态。 Java枚举,远不止是简单的常量集合,它是提升代码健壮性、可读性和可维护性的利器。通过它,我们能将一组固定的、有限的…

    2026年9月30日 • 用户投稿
    200
  • R包降级也不全是那么简单

    R包降级也不全是那么简单R包降级也不全是那么简单R包降级也不全是那么简单R包降级也不全是那么简单

    如果你是windows用户,可能会遇到make缺失的错误,如下图所示: 尽管我已经多年未使用Windows,但解决这个问题其实非常简单,只需通过谷歌搜索即可找到答案: 实际上,这是由于rtools缺失导致的问题。Windows用户只需下载适合的rtools版本并安装即可解决。 下载并安装Rtools…

    2026年9月30日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信