已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
龙图教育,全球游戏50强教育品牌 JavaScript构造函数及new运算符和其他高级语言一样JavaScript中也有构造函数和 new 运算符,我们知道 new 是用来实例化一个类,从而在内存中分配一个实例对象。 但在 Javascript 中,万物皆对象,为什么还要通过 new 来产生对象? 1、认识new运算符function Animal(name) = name; Animal.color = black; Atotype.say = function() console.log(Im + ); ; var cat = new Animal(cat); console.log( , /cat cat.height /undefined ); cat.say(); /Im cat console.log( A, /Animal Animal.color /back ); Animal.say(); /Animal.say is not a function如果你能理解上面输出的结果,说明你已非常了解new和this的运行机制,请忽略本文!我们将通过解析这个例子来加深你对js中new运算符的理解! PS:如果你对this还不了解,请先阅读:JS作用域和this关键字2、代码解读 1-3行创建了一个函数Animal,并在其this上定义了属性:name,name的值是函数被执行时的形参。 第4行在Animal对象(Animal本身是一个函数对象)上定义了一个静态属性:color,并赋值“black” 5-7行在Animal函数的原型对象prototype上定义了一个say()方法,say方法输出了this的name值。 第8行通过new关键字创建了一个新对象cat 10-14行cat对象尝试访问name和color属性,并调用say方法。 16-20行Animal对象尝试访问name和color属性,并调用say方法。3、重点解析第8行代码是关键:var cat = new Animal(cat);Animal 本身是一个普通函数,但当通过new来创建对象时,Animal就是构造函数。JS引擎执行这句代码时,在内部做了很多工作,用伪代码模拟其工作流程如下:new Animal(cat) = var obj = ; obj._proto_ = Atotype; var result = Animal.call(obj,cat); return typeof result = object? result : obj;(1)创建一个空对象obj;(2)把obj的_proto_ 指向构造函数Animal的原型对象prototype,此时便建立了obj对象的原型链:obj-Atotype-Ototype-nullPS:如果你不了解JS原型链,请先阅读:JS原型和原型链(3)在obj对象的执行环境调用Animal 函数并传递参数“cat”。 相当于var result = obj.Animal(cat)。当这句执行完之后,obj便产生了属性name并赋值为cat。【关于JS中call的用法请阅读:JS的call和apply】(4)考察第3步返回的返回值,如果无返回值或者返回一个非对象值,则将obj返回作为新对象;否则会将返回值作为新对象返回。理解了其运行机制以后,我们知道cat其实就是过程(4)的返回值,因此我们对cat对象的认知就多了一些:l cat的原型链是:cat-Atotype-Ototype-nulll cat上新增了一个属性:name分析完了cat的产生过程,我们再看看输出结果: - 在过程(3)中,obj对象就产生了name属性。因此就是这里的cat.color - cat会先查找自身的color,没有找到便会沿着原型链查找,在上述例子中,我们仅在Animal对象上定义了color,并没有在其原型链上定义,因此找不到。cat.say - cat会先查找自身的say方法,没有找到便会沿着原型链查找,在上述例子中,我们在Animal的prototype上定义了say,因此在原型链上找到了say方法。另外,在say方法中还访问,这里的this指的是其调用者obj,因此输出的是的值。对于Animal来说,它本身也是一个对象,因此,它在访问属性和方法时也遵守上述查找规则,所以:Animal.color - blackA - Animal , Animal先查找自身的name,找到了name, 但这个name不是我们定义的name,而是函数对象内置的属性。一般情况下,函数对象在产生时会内置name属性并将函数名作为赋值(仅函数对象)。Animal.say - Animal在自身没有找到say方法,也会沿着其原型链查找,话说Animal的原型链是什么呢?从测试结果看:Animal的原型链是这样的: Animal-Ftotype-Ototype-null因此Animal的原型链上没有定义say方法!4、new存在的意义认识了new运算符之后,我们再回到开篇提到的问题:JS中万物皆对象,为什么还要通过new来产生对象?要弄明白这个问题,我们首先要搞清楚cat和Animal的关系:通过上面的分析,我们发现cat继承了Animal中的部分属性,因此我们可以简单的理解:Animal和cat是继承关系。另一方面,cat是通过new产生的对象,那么cat到底是不是Animal的实例对象? 我们先来了解一下JS是如何来定义“实例对象”的?A instanceof B如果上述表达式为true,JS认为A是B的实例对象,我们用这个方法来判断一下cat和Animalcat instanceof Animal; /true从执行结果看:cat确实是Animal实例,要想证实这个结果,我们再来了解一下JS中instanceof的判断规则:var L = A._proto_;var R = B.prototype;if(L = R) return true;如果A的_proto_ 等价于 B的prototype,就返回true在new的执行过程(2)中,cat的_proto_指向了Animal的prototype,所以cat和Animal符
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年村干部考试试题及答案
- 介入科医师技能定级认证试卷与答案真题题库
- 给自己的合同
- 信息安全守秘合同遵守承诺书3篇
- 实有人口登记租房合同
- 2025年仓储部安全管理员安全意识提升与责任落实试卷
- 2025年抖音本地生活服务团队管理团队激励策略试卷
- 第三人利益合同
- 疫情物资合同
- 国家管网集团山东分公司2026届秋季高校毕业生招聘笔试模拟试题(浓缩500题)及答案详解【新】
- 眼科“一科一品”护理亮点
- 凹印机培训课件下载
- 麻精药培训课件
- 社区获得性肺炎临床路径
- 自来水公司考试试题及答案
- 基于碳点的比率型荧光检测平台构建及应用研究
- 护士(血液透析室)考试试题及答案
- 2025至2030中国脑深部刺激(DBS)装置行业发展趋势分析与未来投资战略咨询研究报告
- 健康素养66条课件教学
- 亲子活动挖红薯活动方案
- 2025 年 5 月基金从业资格考试《证券投资基金基础知识》真题及答案解析
评论
0/150
提交评论