标签:
每个Javascript对象都包含着对一个原型对象的内部引用。原型对象的任何属性,都表现为每个以它为原型的方法的属性。也就是说,javascript对象可以从它的原型那里继承属性。
prototype实现原理
所有的对象都可以有prototype, prototype自己也是对象,那么他也可以有prototype,这样循环下去就形成了一个prototype链, 这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null) 。
创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype。
我们再看下面的代码:
objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype, 这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作。
objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val。
在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找 的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。
现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property 所以Object.prototype返回。
最后val是undefined,因为MyObject1和MyObject2,还有Object都没有定义madeUpProperty这个property,所以得到的是undefine.
读操作会读取在obj自己和prototype 链上发现的第一个同名属性值。
写操作会为obj对象本身创建一个同名属性(如果这个属性名不存在。这就意味着objectRef.testNumber = 3会在objectRef对象上创建一个property,名字是testNumber,当下一次在要读取testNumber时propertype链就不会工作,仅仅会得到objectRef的property 3,而MyObject1的testNumber属性并不会被修改。
判断对象原型的方法isPrototypeOf()
如果isPrototypeOf()方法所属的对象是参数的原型对象,那么,该方法就返回true。否则返回false,例如:
判断是否原型对象的继承属性
Object.hasOwnProperty()方法用来区分继承的属性和对象的属性。
本节链接至:http://www.baidu.com/link?url=urLhG4zmUyJ-w2xDK74xADY4Ab0kRN6E8Lu2wJXCAq3AB51fzNmEooJlGjYvahnFw9wpx573mgmXhxekb_zSfvzoQwDdXcGNkRLg7GHhf-q&wd=&eqid=ea8aa48b000026740000000656614780
如有侵权请留言告知,本人立即删除。
标签:
原文地址:http://www.cnblogs.com/pm-dongjian/p/5019950.html