欢迎来到天天文库
浏览记录
ID:8976037
大小:114.50 KB
页数:7页
时间:2018-04-13
《javascript构造函数及new运算符》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、龙图教育,全球游戏50强教育品牌www.longtuedu.com.cnJavaScript构造函数及new运算符和其他高级语言一样 JavaScript 中也有构造函数和new运算符,我们知道new是用来实例化一个类,从而在内存中分配一个实例对象。但在Javascript中,万物皆对象,为什么还要通过new来产生对象?1、认识new运算符functionAnimal(name){this.name=name;}Animal.color="black";Animal.prototype.say=function(){console.lo
2、g("I'm"+this.name);};varcat=newAnimal("cat");console.log(cat.name,//catcat.height//undefined);cat.say();//I'mcatconsole.log(Animal.name,//AnimalAnimal.color//back);龙图教育,全球游戏50强教育品牌www.longtuedu.com.cnAnimal.say();//Animal.sayisnotafunction如果你能理解上面输出的结果,说明你已非常了解new和this的运
3、行机制,请忽略本文!我们将通过解析这个例子来加深你对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关键字创建了一个新
4、对象cat 10-14行cat对象尝试访问name和color属性,并调用say方法。 16-20行Animal对象尝试访问name和color属性,并调用say方法。龙图教育,全球游戏50强教育品牌www.longtuedu.com.cn3、重点解析 第8行代码是关键: varcat=newAnimal("cat");Animal本身是一个普通函数,但当通过new来创建对象时,Animal就是构造函数。JS引擎执行这句代码时,在内部做了很多工作,用伪代码模拟其工作流程如下:newAnimal("cat")={varobj={};obj
5、.__proto__=Animal.prototype;varresult=Animal.call(obj,"cat");returntypeofresult==='object'?result:obj;}(1)创建一个空对象obj;(2)把obj的__proto__指向构造函数Animal的原型对象prototype,此时便建立了obj对象的原型链:obj->Animal.prototype->Object.prototype->nullPS:如果你不了解JS原型链,请先阅读:JS原型和原型链龙图教育,全球游戏50强教育品牌www.l
6、ongtuedu.com.cn(3)在obj对象的执行环境调用Animal函数并传递参数“cat”。相当于varresult=obj.Animal("cat")。当这句执行完之后,obj便产生了属性name并赋值为"cat"。【关于JS中call的用法请阅读:JS的call和apply】(4)考察第3步返回的返回值,如果无返回值或者返回一个非对象值,则将obj返回作为新对象;否则会将返回值作为新对象返回。理解了其运行机制以后,我们知道cat其实就是过程(4)的返回值,因此我们对cat对象的认知就多了一些:lcat的原型链是:cat->A
7、nimal.prototype->Object.prototype->nulllcat上新增了一个属性:name分析完了cat的产生过程,我们再看看输出结果:cat.name->在过程(3)中,obj对象就产生了name属性。因此cat.name就是这里的obj.namecat.color->cat会先查找自身的color,没有找到便会沿着原型链查找,在上述例子中,我们仅在Animal对象上定义了color,并没有在其原型链上定义,因此找不到。龙图教育,全球游戏50强教育品牌www.longtuedu.com.cncat.say->ca
8、t会先查找自身的say方法,没有找到便会沿着原型链查找,在上述例子中,我们在Animal的prototype上定义了say,因此在原型链上找到了say方法。另外,在say方法中还访问this.name,这里
此文档下载收益归作者所有