欢迎来到天天文库
浏览记录
ID:42623747
大小:591.94 KB
页数:21页
时间:2019-09-19
《JavaScript 彻底理解JavaScript原型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、彻底理解JavaScript原型原型是JavaScript中一个比较难理解的概念,原型相关的属性也比较多,对象有"[[prototype]]"属性,函数对象有"prototype"属性,原型对象有"constructor"属性。为了弄清原型,以及原型相关的这些属性关系,就有了这篇文章。相信通过这篇文章一定能够清楚的认识到原型,现在就开始原型之旅吧。认识原型开始原型的介绍之前,首先来认识一下什么是原型?在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript
2、的对象中都包含了一个"[[Prototype]]"内部属性,这个属性所对应的就是该对象的原型。"[[Prototype]]"作为对象的内部属性,是不能被直接访问的。所以为了方便查看一个对象的原型,Firefox和Chrome中提供了"__proto__"这个非标准(不是所有浏览器都支持)的访问器(ECMA引入了标准对象原型访问器"Object.getPrototype(object)")。实例分析下面通过一个例子来看看原型相关概念:functionPerson(name,age){this.na
3、me=name;this.age=age;this.getInfo=function(){console.log(this.name+"is"+this.age+"yearsold");};}varwill=newPerson("Will",28);在上面的代码中,通过了Person这个构造函数创建了一个will对象。下面就通过will这个对象一步步展开了解原型。 Step1:查看对象will的原型通过下面代码,可以查看对象will的原型:console.log(will.__proto__);
4、console.log(will.constructor);结果分析:·"Person{}"对象就是对象will的原型,通过Chrome展开可以看到,"Person{}"作为一个原型对象,也有"__proto__"属性(对应原型的原型)。·在这段代码中,还用到了"constructor"属性。在JavaScript的原型对象中,还包含一个"constructor"属性,这个属性对应创建所有指向该原型的实例的构造函数。o通过"constructor"这个属性,我们可以来判断一个对象是不是数组类型o
5、functionisArray(myArray){oreturnmyArray.constructor.toString().indexOf("Array")>-1;}o在这里,will对象本身并没有"constructor"这个属性,但是通过原型链查找,找到了will原型(will.__proto__)的"constructor"属性,并得到了Person函数。 Step2:查看对象will的原型(will.__proto__)的原型既然will的原型"Person{}"也是一个对象,那么我们
6、就同样可以来查看"will的原型(will.__proto__)的原型"。运行下面的代码:console.log(will.__proto__===Person.prototype);console.log(Person.prototype.__proto__);console.log(Person.prototype.constructor);console.log(Person.prototype.constructor===Person);结果分析:·首先看"will.__proto__=
7、==Person.prototype",在JavaScript中,每个函数都有一个prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的__proto__属性),也就是说,所有实例的原型引用的是函数的prototype属性。了解了构造函数的prototype属性之后,一定就明白为什么第一句结果为true了。oprototype属性是函数对象特有的,如果不是函数对象,将不会有这样一个属性。·当通过"Person
8、.prototype.__proto__"语句获取will对象原型的原型时候,将得到"Object{}"对象,后面将会看到所有对象的原型都将追溯到"Object{}"对象。·对于原型对象"Person.prototype"的"constructor",根据前面的介绍,将对应Person函数本身。通过上面可以看到,"Person.prototype"对象和Person函数对象通过"constructor"和"prototype"属性实现了相互引用(后面会有图展示这个相互引用的关系)。 Step3:
此文档下载收益归作者所有