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

JavaScript 原型与原型链

原型与原型链

要讨论原型与原型链,就要先了解什么是 构造函数 ,构造函数与普通函数没有太大的区别,使用 new关键字 创建实例对象的函数,就叫做构造函数。

在js中,每一个函数类型的数据都有一个 .prototype 的属性,这个属性指向一个对象,叫做 原型对象

原型对象有一个属性叫做 constructor 的属性,指向他的 构造函数

在使用构造函数构造不同的实例对象时,有些 属性方法 是相同的,如果每个实例对象都创建这些相同的属性,有些浪费,可以存在原型对象里以共享。这也是原型对象最重要的作用。

对于这些共有的属性和方法,实例对象可以直接用 点运算符 访问,原因是实例对象在本身找不到对应的属性和方法时,会查找其构造函数的原型对象。所以可以用 实例.constructor 来查看该实例的构造函数。

如果实例本身没有该属性和方法,其构造函数的原型对象也没有,会继续往原型对象上去寻找,原型链概念就呼之欲出了。

先了解 显式原型隐式原型

显式原型 是用 prototype 属性查找原型,是函数类型数据的属性,函数可以用这个方法,构造函数也可以用,找到的是这个构造函数的原型对象。

隐式原型 是用 proto 属性查找原型,是对象类型数据的属性,对象可以用这个方法,实例对象也可以用,找到的是这个实例对象的构造函数的原型对象。

原型对象 也是一个对象,也有 proto 属性,在js中,对象的构造函数是 Object() ,所以其原型对象是 Object.prototype

Object.prototype 也是一个对象,不过 Object.prototype 比较特殊,没有原型对象,或者说其_proto_指向的是 null 。所以 Object.prototype 是原型链的尽头。

如果实例本身没有该属性和方法,则寻找实例的原型对象,如果实例的原型对象也没有,则继续寻找该原型对象的原型对象,直至null。这样的顺着 proto 寻找的链状结构就叫做 原型链 ,也叫做 隐式原型链

js中,函数也是一种对象,而函数的构造函数为 Function() ,所有函数都可以看作是 Function() 的实例对象,而 Function() 本身也是函数,所以 Function() 是自己的实例对象。函数的 protoFunction.prototypeFunction.prototype 的原型对象是 Object.prototype

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • oracle 事务回滚
  • 如何培养单元测试的习惯?怎样才算一个好的单元测试?
  • 计算机图形学 | 动画模拟
  • eNSP 华为ACL配置
  • vue2项目从0到1记录
  • Linux软件编程---数据库
  • VSCode打开HBuilderX创建的uniapp项目
  • Vue.js与UI构建
  • Autojs详解
  • 解决macOS下Homebrew下载慢的问题
  • [JS]经典面试题-基础篇
  • 泛微基于华为仓颉编程语言开发公文交换系统 推动办公软件全面国产化
  • 代码随想录算法训练营第二十三天(回溯 二)
  • 目标检测(Object Detection)
  • 深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)
  • 230. Kth Smallest Element in a BST
  • AHK 中 = 和 == 等比较运算符的用法
  • ES6简单总结(搭配简单的讲解和小案例)
  • Promise面试题2实现异步串行执行
  • Redis在Web项目中的应用与实践
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 从setTimeout-setInterval看JS线程
  • 排序(1):冒泡排序
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端性能优化——回流与重绘
  • 前端自动化解决方案
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 因为阿里,他们成了“杭漂”
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 阿里云重庆大学大数据训练营落地分享
  • ​如何在iOS手机上查看应用日志
  • ​数据链路层——流量控制可靠传输机制 ​
  • # Apache SeaTunnel 究竟是什么?
  • (06)金属布线——为半导体注入生命的连接
  • (2)(2.10) LTM telemetry
  • (C语言)fgets与fputs函数详解
  • (附源码)计算机毕业设计大学生兼职系统
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • ..回顾17,展望18
  • .NET 8.0 发布到 IIS
  • .NET 命令行参数包含应用程序路径吗?
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net操作Excel出错解决
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET使用存储过程实现对数据库的增删改查
  • ;号自动换行
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []C/C++读取串口接收到的数据程序
  • [16/N]论得趣
  • [Django学习]查询过滤器(lookup types)
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [JAVA数组] 三个数的最大乘积