prototype原理详解
prototype原理详解
prototype的关键字
函数每次被new都会创建一个新的对象.
举一个简单的例子,先假设有一个function Person(){this.uage=18;} 这个函数中,有一个属性this.uage=18;
然后理所当然的,每一个被new出来的Person对象都会有这个属性.如var p=new Person();p.uage是理所当然能点出来的.p2 p3也可以
那么这个Person函数对象内部是怎么样的一个存在呢.画一个简单的图来说明就是如下图;(这个函数内部有个length用来存放参数的个数.有个prototype属性.这个属性会指向一个新的对象.这个对象的实质和new出来的那些p1 p2 p3是没有什么区别的.都是一个独立的空间.但是这个空间是可以用来存放东西的.也就是说,当用户输入这样一段代码的时候,Person.prototype.name="aa";那么就会在prototype所指向的对象空间中分配一个空间用来存放这个属性.如下图2.而所有被new出来的Person对象.也就是那些p1 p2 p3所指向的其实也是一个对象.如图3,它们会天然的继承Person对象中已经明确声明的uage属性.也就是在自己的对象里也各自分配一个空间来存放这个this.uage=18的字段.同时它们还具备一个__proto__的属性.这个属性其实就是prototype对象.因为它在这些对象中所充当的角色和这项对象的宿主也就是Person中的prototype所指向的是同一块内存地址(或者说同一个对象).那就是分配了name="aa"的那块地址.这样一来就彻底解释了.为什么只要再一个函数的prototype中加了一个函数或者属性,就能在这个函数new出来的所有对象中都同意可以被使用了.原理就是,他们会通过__proto__这个属性去访问函数中的prototype所指向的地址,寻找所需的方法或属性.如果没有找到就向上级Object中去找.如果也没有.就会通过弱语言的特性,重新创建一个.但是这个重新创建出来的,就只有这个对象可以使用(举例说明,就是如现在Person中有uage属性,这是Person函数中声明的,所以所有Person的对象都能被继承,有name属性,这是Person的prototype所指向的那款内存空间里所声明的.Person的对象通过自身天然具备__proto__属性能够获取到.可是现在用户希望能知道p1这个对象的id.也就是说要一个p1.id.这个时候,内部的顺序就是这样的,先从Person中找.显然找不到这个属性,然后去prototype和Object中找,显然也找不到这个属性.那么就剩下最后一条,自动创建一个id属性了.可是这个自动创建的id属性是在p1所指向的对象中,只能p1使用.也就是说,如果在创建一个p2对象.是点不出id这个对象来的.但是如果是用Person.prototype.id来创建.则不管是p1还是p2或p其他.所有Person对象都能点出来这个属性了))