热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解JavaScript中的原型和原型链机制

在JavaScript中,原型和原型链是核心概念。通过定义构造函数`functionFoo(){}`,可以创建实例对象`letf1=newFoo()`。继承机制主要依赖于每个函数都具有的`prototype`属性,除了内置的`Function`构造函数之外,这一特性使得对象间的属性和方法共享成为可能。原型链通过链接这些原型对象,实现了复杂而灵活的继承结构,为JavaScript的面向对象编程提供了坚实的基础。

《一次性搞懂js中的原型与原型链》

组织函数:function Foo ( ) { };
实例对象:let f1=new Foo;

  1. 谈到继续时,Javascript 只要一种构造:对象
  2. 每一个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向原型。
prototype

每一个Javascript对象(null除外)在建立的时刻就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都邑从原型”继续”属性。

函数的 prototype 属性指向了一个对象,这个对象恰是挪用该组织函数而建立的实例的原型,也就是这个例子中的 f1 的原型。prototype带有__proto__和constructor

proto

每一个Javascript对象(除了 null )都具有的一个属性,叫
__proto__,这个属性会指向了
建立该对象的组织函数的原型。

console.log(f1._proto_ === Foo.prototype) // trueconstructor

每一个原型都有一个 constructor 属性指向关联的组织函数

因为实例对象能够继续原型对象的属性,所以实例对象也具有constructor属性,一样指向原型对象对应的组织函数。

console.log(Foo.prototype.cOnstructor=== Foo);//true
console.log(f1.cOnstructor=== Foo);//true
console.log(f1.hasOwnProperty('constructor'));//false
原型链

JS在建立对象(不论是一般对象照样函数对象)的时刻,都有一个叫做__proto__的内置属性,用于指向建立它的函数对象的原型对象prototype。以上面的例子为例:

console.log(fo.__proto__ === Foo.prototype) //true

一样Foo.prototype也有proto属性

console.log(Foo.prototype.__proto__ === Object.prototype) //true

Object.prototype对象也有proto属性,但它比较特别,为null

console.log(Object.prototype.__proto__ === null)

我们把这个有proto串起来的直到Object.prototype.proto为null的链叫做原型链。原型链的构成是真恰是靠proto 而非prototype

总结
  • 每一个组织函数都有一个原型对象

    Foo.prototype

  • 原型对象都包括一个指向组织函数的指针

    Foo.prototype.cOnstructor=== Foo

  • 实例都包括一个指向原型对象的内部指针

    fo.__proto__ === Foo.prototype

更多文章请前去语雀


推荐阅读
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文详细介绍了 JavaScript 中类 (class) 的基本语法、定义方式、属性保护方法、私有属性的实现以及继承机制。通过具体的代码示例和详细的解释,帮助开发者更好地掌握 JavaScript 类的相关知识。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 本文详细介绍了 org.apache.commons.io.IOCase 类中的 checkCompareTo() 方法,通过多个代码示例展示其在不同场景下的使用方法。 ... [详细]
  • 基于JQuery实现的评分插件
    本文介绍了一个使用JQuery创建的交互式评分控件。当用户将鼠标悬停在星星上时,左侧的星星会变为实心,右侧保持空心,并显示对应的评分等级;移开鼠标后,所有星星恢复为空心状态。 ... [详细]
  • 本文介绍如何在Node.js环境中执行Powershell脚本,并详细说明了通过子进程处理命令输出和错误信息的具体步骤。 ... [详细]
  • 作为一名 Ember.js 新手,了解如何在路由和模型中正确加载 JSON 数据是至关重要的。本文将探讨两者之间的差异,并提供实用的建议。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
  • 本文介绍如何通过 JavaScript 实现一个基于鼠标坐标的 Tooltip 弹出层,详细解释了如何获取窗口和文档的尺寸及滚动位置,并优化了代码结构。 ... [详细]
  • 本文详细介绍了JavaScript中数组的两个重要高阶函数:map()和reduce()。map()用于将数组中的每个元素通过指定的函数进行处理并返回一个新的数组,而reduce()则用于对数组中的元素进行累积计算,最终返回一个单一值。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 探讨在 JavaScript 中使用不同方向的 for 循环来实现跟随鼠标的 div 动画时,为什么会出现不同的视觉效果。 ... [详细]
  • 本文介绍了一个SQL Server自定义函数,用于从字符串中提取仅包含数字和小数点的子串。该函数通过循环删除非数字字符来实现,并附带创建测试表、存储过程以演示其应用。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
author-avatar
patrick0129_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有