位置: 编程技术 - 正文

js老生常谈之this,constructor ,prototype全面解析(彻底弄懂js中的this指向)

编辑:rootadmin

推荐整理分享js老生常谈之this,constructor ,prototype全面解析(彻底弄懂js中的this指向),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js中this的三种用法,js 的this,如何理解js中的this,js中this的概念,js中this的概念,如何理解js中的this,js中this的概念,js 的this,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

javascript中的this,constructor ,prototype,都是老生常谈的问题,深入理解他们的含义至关重要。在这里,我们再来复习一下吧,温故而知新!

this

this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。

先看一个在全局作用范围内使用this的例子:

函数中的this是在运行时决定的,而不是函数定义时,如下:

全局函数apply和call可以用来改变函数中this的指向,如下:

注:apply和call两个函数的作用相同,唯一的区别是两个函数的参数定义不同。

因为在JavaScript中函数也是对象,所以我们可以看到如下有趣的例子:

prototype

prototype本质上还是一个JavaScript对象。

并且每个函数都有一个默认的prototype属性。 如果这个函数被用在创建自定义对象的场景中,我们称这个函数为构造函数。 比如下面一个简单的场景:

js老生常谈之this,constructor ,prototype全面解析(彻底弄懂js中的this指向)

作为类比,我们考虑下JavaScript中的数据类型 - 字符串(String)、数字(Number)、数组(Array)、对象(Object)、日期(Date)等。

我们有理由相信,在JavaScript内部这些类型都是作为构造函数来实现的,比如:

同时对数组操作的很多方法(比如concat、join、push)应该也是在prototype属性中定义的。 实际上,JavaScript所有的固有数据类型都具有只读的prototype属性 (这是可以理解的:因为如果修改了这些类型的prototype属性,则哪些预定义的方法就消失了), 但是我们可以向其中添加自己的扩展方法。

注意:这里有一个陷阱,向Array的原型中添加扩展方法后,当使用for-in循环数组时,这个扩展方法也会被循环出来。 下面的代码说明这一点(假设已经向Array的原型中扩展了min方法):

解决方法也很简单:

constructor

constructor始终指向创建当前对象的构造函数。比如下面例子:

但是当constructor遇到prototype时,有趣的事情就发生了。 我们知道每个函数都有一个默认的属性prototype,而这个prototype的constructor默认指向这个函数。如下例所示:

当时当我们重新定义函数的prototype时(注意:和上例的区别,这里不是修改而是覆盖), constructor的行为就有点奇怪了,如下示例:

为什么呢? 原来是因为覆盖Person.prototype时,等价于进行如下代码操作:

而constructor始终指向创建自身的构造函数,所以此时Person.prototype.constructor === Object,即是:

怎么修正这种问题呢?方法也很简单,重新覆盖Person.prototype.constructor即可:

也可以这么写:

以上这篇js老生常谈之this,constructor ,prototype全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

JS中JSON对象和String之间的互转及处理技巧 JSON:JavaScript对象表示法(JavaScriptObjectNotation),其实JSON就是一个JavaScript的对象(Object)而已。如有不清楚JSON,可以去w3cschool了解

IE8 内存泄露(内存一直增长 )的原因及解决办法 最近开发的时候对页面使用了定时的局部更新,结果在ie6,7和Firefox下,一切正常,而在ie8下过上几个小时就浏览器就崩溃了,显示是内存溢出,我以为

JS实现把鼠标放到链接上出现滚动文字的方法 本文实例讲述了JS实现把鼠标放到链接上出现滚动文字的方法。分享给大家供大家参考,具体如下:divid="tooltip2"style="position:absolute;visibility:hidden;clip:rect(

标签: 彻底弄懂js中的this指向

本文链接地址:https://www.jiuchutong.com/biancheng/373397.html 转载请保留说明!

上一篇:实例详解ECMAScript5中新增的Array方法(vxlan配置实例详解)

下一篇:JS中JSON对象和String之间的互转及处理技巧(如何实现js对象和json数据互转)

  • 应交税费借方余额0.01怎么调整
  • 纳税申报期限是纳税期限期满后的时间
  • 小企业会计准则是什么意思
  • 出纳与会计现金对不上
  • 销售是销项税还是进项税
  • 原始凭证分类的目的是什么?
  • 新政府会计制度下属于负债类科目的是
  • 未达起征点标志
  • 专票当成普票入账怎么调整
  • 公司注销时发现很多年前多发了员工的工资
  • 支付技术转让费能加计扣除
  • 进口设备不需要交关税吗
  • 小微企业所得税优惠政策
  • 不占股权投资如何做账
  • 小型微利企业核定征收
  • 垃圾清运工程师
  • surface安装win10专业版
  • 表格关闭函数
  • 会计科目对应的会计要素
  • 运输公司转包业务怎么开票
  • 其他货币资金期末处理
  • 文件类型设置
  • win7为什么还有人用
  • 个人二手车转让协议书免费
  • 异地工程预缴增值税怎么计算
  • 小规模纳税人无法开具增值税专用发票
  • 长期挂账的在建工程如何处理
  • 'The Wave' sandstone formation in Coyote Buttes North, Paria Canyon-Vermilion Cliffs National Monument, Arizona (© Dennis Frates/Alamy)
  • 卡洛里山脉
  • 华为2022年资产负债表数据
  • springbootssm
  • 合同负债和预收负债的区别
  • php获取目录所有文件
  • php获取文本框输入的值
  • php自定义表单系统
  • vgdisplay命令无效
  • 进项税额转出怎么做账务处理
  • 房地产开发企业会计制度
  • 无法报销的原因
  • 成本核算的会计处理
  • 弥补以前年度亏损最多几年
  • db2replace函数用法
  • 支付运输费计入
  • 怎样备份mysql数据库
  • 差旅费中火车票的进项税怎么计算
  • 个人所得税要计入管理费用吗
  • 小微企业流转税优惠政策
  • 上月发票冲红后怎么作废
  • 自建厂房会计处理
  • 租赁房产税计税依据及计算方式是什么
  • 其他应收款核算什么
  • 免增增值税的有
  • 售后回租租赁合同买车有效吗
  • 关于文化事业建设费的说法错误的是
  • 收到预收账款要确认收入吗
  • 公司厂房房产税计税依据最新
  • 公司账户可以转账到信用卡吗
  • 库存退货怎么做账
  • 简述什么是实收资本
  • 职工福利费核算要求
  • 转账凭证的编制流程
  • sql server中事务有哪三种语句
  • 开机越来越慢会不会是硬件的问题
  • win7自带拍照功能
  • win7系统打开浏览器后突然卡住了
  • centos的防火墙怎么关
  • win10 预览版 移除 tab 栏 特性
  • win7系统谷歌浏览器错误代码a00a0017
  • linux ntp查看
  • unity3d应用开发
  • alt+r没用
  • html5图文混排
  • srslte源码分析
  • 置顶高手
  • jquery基本知识
  • 国际货运怎么代理
  • 北京顶点b128怎么样
  • 浙江省税务局发短信是真的吗
  • 电子税务局密码能随便告诉别人吗
  • 增值税普通发票和电子普通发票的区别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设