简单介绍JavaScript “原型“与“原型链“

本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于“原型“与“原型链“的相关问题,包括了构造函数、原型对象 prototype、对象原型等等内容,下面一起来看一下,希望对大家有帮助。

简单介绍JavaScript “原型“与“原型链“

【相关推荐:javascript视频教程、web前端】

  什么是原型?原型是 JS 基础学习中我们没有提及的概念,原型它是一个泛指,主要包含了 原型对象 (prototype) , 对象原型 (__proto__), 原型链 等等,这些概念据统计也是面试中常常问到的内容,这篇文章就带大家了解并掌握原型的相关知识,让大家不再迷茫。

 一:构造函数

     我们学习过很多面向对象的语言,例如 java c++ 等等,但是 JavaScript 是个例外,在 ES6 之前,是没有类的概念的,那在之前我们如何创建对象呢?原来在 ES6 之前,我们是利用 构造函数 来创建实例化对象的,构造函数是一种特殊的函数,包含了对象的公共特征,要配合 new 一起使用才有意义。

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

构造函数的注意事项:

构造函数名的首字母要大写构造函数要配合 new 一起使用

 1.1 构造函数使用方法

               function Animal(name,age){      //构造函数名首字母大写                this.name=name;                this.age=age;                this.eat=function(){                  console.log('我在吃东西');                }           }           var dog=new Animal('旺财',3)     //要配合 new 一起使用创建对象           console.log(dog.name);           console.log(dog.age);           dog.eat()   

简单介绍JavaScript “原型“与“原型链“

 1.2 构造函数new的执行过程

new 有以下执行过程:

new 的时候会创建一个空对象构造函数内的 this 指向这个空对象执行构造函数内的代码给空对象赋值,添加属性方法返回这个对象

1.3 实例成员与静态成员 

实例成员:

实例成员就是观战属内部用 this 添加的成员实例成员只能通过实例化的对象调访问,不能通过构造函数名访问

              function Animal(name,age){                this.name=name;                this.age=age;           }           var dog=new Animal('旺财',3)           console.log(dog.name);           console.log(Animal.name);   

简单介绍JavaScript “原型“与“原型链“

静态成员:

静态成员就是通过构造函数本身创建的成员静态成员只能通过构造函数名访问,不能通过实例化对象访问

              function Animal(name,age){                this.name=name;                this.age=age;           }           var dog=new Animal('旺财',3)           Animal.color='黑色'           console.log(Animal.color);           console.log(dog.color);   

简单介绍JavaScript “原型“与“原型链“

二: 原型对象 prototype

2.1 为什么有原型对象

在开始将原型对象是什么前,我们先说明一个案例,还是刚才的那个 Animal 类,我们创建了多个实例化对象,输出其实例化对象的两个方法的比较,我们发现输出了 false,即二者的这个复杂数据类型的地址不同,什么原因呢?

          function Animal(name,age){                 this.name=name;           this.age=age;           this.eat=function(){             console.log('我在吃东西');           }      }      var dog=new Animal('旺财',3)           var cat=new Animal('咪咪',3)           var pig=new Animal('哼哼',3)           var fish=new Animal('咕噜',3)           var sheep=new Animal('咩咩',3)           console.log(dog.eat==cat.eat);

简单介绍JavaScript “原型“与“原型链“

在我们创建实例化对象的过程中,new 的过程首先会创建一个新对象,但是复杂数据类型会领开辟一块空间存放(对象,方法),这就造成了构造函数内同样的方法被开辟了无数块内存,造成了内存的极度浪费

简单介绍JavaScript “原型“与“原型链“

2.2 原型对象的使用

     构造函数原型 prototype 是构造函数内的一个属性,其属性是一个指针,指向一个对象,这个对象内存放的就是公共的方法,存在这个对象里的方法,再通过构造函数创建实例化对象时就可以公共利用这一个方法了,不需要再对多个相同的复杂数据类型开辟多个重复的内存空间。就是为了解决上述存在的内存浪费的问题,其也可以直接称为原型对象。

上述案例解决方案: 

解决方案我们使用原型对象存放公共方法,并且让实例化对象调用该方法,并且比较二者的地址是否相同

          function Animal(name,age){                 this.name=name;           this.age=age;      }      Animal.prototype.eat=function(){          console.log('我在吃东西');      }      var dog=new Animal('旺财',3)           var cat=new Animal('咪咪',3)           dog.eat()      cat.eat()      console.log(dog.eat==cat.eat);

我们发现不但成功调用了这个方法,而且二者调用方法的地址是相同的,这就证明了,其公共的复杂数据类型只开辟了一块内存空间,减少了之前公共方法写在构造函数内部资源浪费的问题。

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

简单介绍JavaScript “原型“与“原型链“

 三:对象原型 __proto__

3.1 什么是对象原型?

对象原型__proto__的作用是让你搞清楚一个问题:为什么给构造函数的prototype属性添加的方法,实例化对象却可以使用?这是因为每一个对象都有一个 __proto__属性(注意前后都是两个下划线),这个属性也是一个指针,指向的是其对应构造函数的原型对象 prototype,这就解释了为什么实例化的对象可以去调用原型对象里的方法。

或者可以理解为:

原型对象prototype 等价于 对象原型 __proto__

简单介绍JavaScript “原型“与“原型链“

3.2 关于对象原型__proto__的注意点 

我们要注意对象原型__protp__的作用仅仅是为了给查找原型对象内的内容提供一个方向,我们不需要使用它,只需要记住它指向对应的构造函数的原型对象 prototype 即可

方法的查找原则:

首先去找实例化自身的构造函数身上有没有目标方法,有则调用如果自身构造函数身上没有,由于因为对象自身有属性__protp__,其指向构造函数的原型对象prototype,则会去找原型对象身上有没有该方法

四:构造函数 constructor 

4.1 为什么 constructor 也叫构造函数

对象原型 __proto__ 身上和构造函数的原型对象 prototype 身上都有一个 constructor 属性,之所以叫 constructor 叫构造函数,是因为这个属性指向的是对应的构造函数本身,其主要用于记录实例化的对象引用于哪一个构造函数

打印二者的constructor属性:

          function Animal(name,age){                 this.name=name;           this.age=age;      }      Animal.prototype.eat=function(){         console.log('我在吃东西');      }     var dog=new Animal('旺财',4)     console.log(dog.__proto__.constructor);     console.log(Animal.prototype.constructor);

简单介绍JavaScript “原型“与“原型链“

 我们发现打印出来结果确实为构造函数本身

4.2 手动返回 constructor 的情况

更多时候我们需要手动返回 constructor 指向的哪个构造函数,例如构造函数的原型对象中以对象的形式存入多个公共方法时,就会出现以下情况:

          function Animal(name,age){                 this.name=name;           this.age=age;      }      Animal.prototype={        eat:function(){          console.log('我在吃东西');        },        run:function(){          console.log('我在跑');        }      }      var dog=new Animal('wangchai',3)      console.log(Animal.prototype.constructor);      console.log(dog.__proto__.constructor);

简单介绍JavaScript “原型“与“原型链“

 我们发现其找不到对应的构造函数了,这是因为我们给其原型对象添加方法的添加方式导致的,这钱我们采取的以.方式添加,是在原有基础上追加添加的,不会覆盖掉内部原有的内容。而我们采用=的方法以对象形式添加,其实是一个赋值的过程,将原有内容也给覆盖掉了,这就导致 prototype 内部原有的 constructor 方法被覆盖掉了

 这时就需要我们手动返回 constructor 来找到返回的是哪个的构造函数

          function Animal(name,age){                 this.name=name;           this.age=age;      }      Animal.prototype={        constructor:Animal,        eat:function(){          console.log('我在吃东西');        },        run:function(){          console.log('我在跑');        }      }      var dog=new Animal('wangchai',3)      console.log(Animal.prototype.constructor);      console.log(dog.__proto__.constructor);

简单介绍JavaScript “原型“与“原型链“

这样我们就可以成功拿到其 constructor 指向的哪个构造函数了

其格式为:

constructor : 构造函数名 

【相关推荐:javascript视频教程、web前端】

以上就是简单介绍JavaScript “原型“与“原型链“的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
天国拯救2最强装备是什么
上一篇 2025年11月9日 19:09:54
How does artificial intelligence (AI) transform the internet of things (IoT)?
下一篇 2025年11月9日 19:10:07

相关推荐

  • JavaScript Flow类型检查

    Flow是Facebook开发的JavaScript静态类型检查工具,通过在文件顶部添加// @flow注释启用,支持逐步集成。安装flow-bin后运行npx flow init初始化配置,并在package.json中添加flow脚本。它提供number、string、boolean、Array…

    2026年5月10日
    000
  • js中join()方法的使用

    join() 方法用于将数组元素连接成字符串,不修改原数组。默认以逗号分隔,可自定义分隔符,空数组返回空字符串,null 或 undefined 转为空字符串。 在 JavaScript 中,join() 是数组的一个内置方法,用于将数组中的所有元素连接成一个字符串。这个方法不会修改原数组,而是返回…

    2026年5月10日
    000
  • Svelte中实现变量的首次条件赋值与非响应式管理

    在svelte应用中,对于滚动条高度这类一旦确定便通常保持不变的静态值,持续的响应式计算会造成不必要的性能开销。本教程将介绍一种优化策略,通过结合使用常规变量和条件响应式语句,实现变量的首次条件赋值。一旦满足特定条件并获取到有效值后,变量将停止后续的响应式更新,从而提高应用效率和可预测性。 引言:S…

    2026年5月10日
    000
  • 如何在多个文件输入框中实现独立图片预览功能

    本教程详细阐述了如何在网页中实现多个文件输入框(`input type=”file”`)的独立图片预览功能。通过识别并解决常见错误,如重复id导致的元素选择不当,我们将演示如何利用dom遍历和事件委托,为每个上传区域动态绑定预览逻辑,确保用户上传的每张图片都能在其对应的位置正…

    2026年5月10日
    000
  • 如何理解Event Loop机制并对代码执行顺序进行精准控制?

    Event Loop通过宏任务与微任务协调异步执行,同步代码先运行,随后清空微任务队列再执行宏任务,如:console.log(‘1’)、’4’同步输出,Promise.then入微任务队列输出’3’,setTimeout入宏任…

    2026年5月10日
    000
  • 使用CSS实现鼠标悬停时保持显示的下拉菜单

    本文介绍了如何使用纯CSS实现下拉菜单在鼠标悬停时保持显示,以及鼠标移开后隐藏的交互效果。通过利用CSS的:hover伪类,可以避免使用JavaScript,简化代码并提高性能。同时,也讨论了这种方法在键盘可访问性方面的局限性,并提供了相应的注意事项。 使用CSS :hover 伪类实现下拉菜单 实…

    2026年5月10日
    000
  • Linux用grep递归查找项目中未使用的CSS类名

    先提取CSS文件中的类名,再从HTML和JS中找出使用的类名,最后对比得出未使用类。具体步骤:1. 用grep递归提取./css/下所有以.开头的类选择器,去除点并去重保存为css_classes.txt;2. 在./src/中搜索class属性内的类名,支持引号和模板字符串,提取单词形式的类名去重…

    2026年5月10日
    000
  • 优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践

    优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践优化JavaScript搜索过滤器:添加无匹配结果提示与最佳实践

    本文详细介绍了如何使用原生javascript实现一个功能完善的搜索过滤器,并重点解决在没有匹配项时显示“无匹配结果”提示的需求。教程涵盖了html结构、css样式以及核心javascript逻辑,并提供了代码优化建议,包括使用`display: none`进行元素隐藏以及通过检查过滤结果数量来动态…

    2026年5月10日 用户投稿
    000
  • 解决Laravel中日期数据存储为‘0000-00-00’的常见问题

    在laravel应用中,当从前端日期选择器接收到的日期数据在数据库中意外地存储为’0000-00-00’时,这通常是由于laravel的模型批量赋值保护机制所致。本文将深入探讨这一问题,并提供一个简洁有效的解决方案:通过正确配置eloquent模型的$fillable属性,确…

    2026年5月10日
    000
  • Go App Engine中解决模板文件未找到的路径问题

    在Go App Engine开发中,遇到`panic: open templates/base.html: The system cannot find the path specified`错误是常见的模板文件加载问题。本文将深入探讨Go App Engine的文件访问机制,特别是`app.yam…

    2026年5月10日
    000
  • JavaScriptTC39标准_JavaScript语言规范解读

    TC39通过五阶段流程推动JavaScript发展,确保语言在兼容基础上持续进化,近年引入可选链、空值合并、顶级await等特性,并推进记录与元组、装饰器等提案,开发者可通过GitHub跟踪进展并用Babel实验新功能。 JavaScript语言的发展离不开TC39组织的推动。TC39是负责ECMA…

    2026年5月10日
    000
  • 如何创建函数_javascript中有哪些方式?

    JavaScript创建函数有四种方式:函数声明(具名、可提升)、函数表达式(匿名或具名、不可提升)、箭头函数(无this/arguments、不可构造)、Function构造函数(动态生成、性能差)。 在 JavaScript 中创建函数主要有四种常用方式,每种适用场景不同,理解区别能帮你写出更清…

    2026年5月10日
    000
  • 如何利用Web Workers提升前端应用的性能与响应能力?

    如何利用Web Workers提升前端应用的性能与响应能力?如何利用Web Workers提升前端应用的性能与响应能力?如何利用Web Workers提升前端应用的性能与响应能力?如何利用Web Workers提升前端应用的性能与响应能力?

    Web Workers通过将耗时任务移至后台线程避免主线程阻塞,提升前端性能。它基于独立上下文运行JavaScript,不访问DOM,通过postMessage通信,适用于大数据处理、加密解压等计算密集型任务。创建Worker实例并加载单独JS文件即可实现异步执行,如数组排序不卡页面。需注意结构化克…

    2026年5月10日 用户投稿
    000
  • HTML评分标签怎么添加_产品评分结构化数据实现

    答案:添加HTML评分标签需使用Schema.org的JSON-LD格式,核心类型包括Product、AggregateRating和Review。将包含ratingValue和reviewCount的AggregateRating嵌套在Product中,可实现搜索结果中的富媒体摘要展示,确保数据与…

    2026年5月10日
    000
  • 在 React 应用中实施内容安全策略 (CSP) 的实践指南

    本教程探讨了在 React 应用中实施内容安全策略 (CSP) 时遇到的挑战,特别是针对内联样式和脚本的限制。文章提供了通过将样式外部化、使用 SHA256 哈希或 Nonce 来满足 CSP 要求的解决方案,并指导如何配置构建工具以避免不必要的内联脚本,旨在帮助开发者构建更安全的 React 应用…

    2026年5月10日
    000
  • 如何实现图片在页面中宽高一直保持16:9的比例

    本篇文章给大家带来的内容是关于如何实现图片在页面中宽高一直保持16:9的比例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 目标:遇到一个需求,让图片在页面中,不管宽度如何变化。宽高保持16:9的比例。 实现: 方法一:这也是比较经典的一个方法,利用padding-bottom来实…

    用户投稿 2026年5月10日
    000
  • 如何通过不可变数据结构提升React等框架的应用性能?

    使用不可变数据结构可提升React性能,因它确保状态更新可预测、避免引用共享导致的bug;通过concat、扩展运算符等创建新对象,使PureComponent和React.memo的浅比较更高效;每次更新生成新状态快照,便于调试、回溯与撤销;结合useMemo、useCallback可稳定依赖项,…

    2026年5月10日
    000
  • HTML5如何上传文档_HTML5文档上传实现与文件传输技巧【指南】

    HTML5文档上传需结合input file控件、XMLHttpRequest进度监控、Fetch+AbortController中断控制、前端校验及分片断点续传。 。 2、为该元素绑定 change 事件监听器,当用户选择文件后触发回调函数。 立即学习“前端免费学习笔记(深入)”; 3、在回调中通…

    2026年5月10日
    000
  • Service Worker架构:高效令牌处理与网络请求同步实现

    本文探讨了在Service Worker中高效管理认证令牌的策略,特别是如何处理令牌的周期性更新以及确保所有网络请求都能同步获取并使用最新令牌。核心方案是利用JavaScript Promise的特性,通过替换Promise对象而非修改其状态,实现请求的等待与令牌的动态更新,并提供了健壮的错误处理机…

    2026年5月10日
    000
  • JavaScript DOM操作:解决null错误与实现动态显示隐藏效果

    本文旨在解决JavaScript在尝试操作尚未加载的DOM元素时出现的null错误,并详细阐述如何正确地实现基于鼠标悬停的元素显示/隐藏效果。核心内容包括理解脚本加载时机的重要性、script标签的放置策略,以及如何使用事件监听器和CSS类来动态控制元素可见性,同时提供处理多个相似元素的通用方法。 …

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信