每个Javascript对象都包含着对一个原型对象的内部引用。原型对象的任何属性,都表现为每个以它为原型的方法的属性。也就是说,javascript对象可以从它的原型那里继承属性。
prototype实现原理
所有的对象都可以有prototype, prototype自己也是对象,那么他也可以有prototype,这样循环下去就形成了一个prototype链, 这个链当他遇到链中队形的prototype是null时中止。(Object的默认的prototype是null) 。
1 var objectRef = new Object(); //create a generic javascript object.
创建一个新的js对象,这时这个对象的prototype是Null,所以objectRef的prototype链只包含一个对象Object.prototype。
我们再看下面的代码:
1 /* 构建MyObject1这个类型的构造函数 MyObject1 - type.
2 */
3 function MyObject1(formalParameter){
4 /* 为者对象创建一个属性名字叫testNumber*/
5 this.testNumber = formalParameter;
6 }
7
8 /* 构建MyObject2这个类型的构造函数 MyObject2 - type:-*/
9 function MyObject2(formalParameter){
10 /* 为者对象创建一个属性名字叫testString*/
11 this.testString = formalParameter;
12 }
13
14 /* 下一步的操作会用MyObject1对象替换掉MyObject2默认的prototype属性*/
15 MyObject2.prototype = new MyObject1( 8 );
16
17 /* 最后我们创建MyObject2类型的一个对象*/
18 var objectRef = new MyObject2( "String_Value" );
objectRef这个MyObject2类型的对象有一个prototype的链,链中的第一个对象是MyObject1对象,MyObject1对象也有prototype, 这个prototype是Object默认的prototype,Object.prototype的prototype是null,至此这条prototype链结束。
当一个取值操作发生时,objectRef 的整个prototype链就开始工作。
1 var val = objectRef.testString;
objectRef这个对象的有一个属性叫做testString,那么这句代码会把testString的值赋给val。
1 var val = objectRef.testNumber;
在objectRef这个对象里并没有testNumber这个属性,但是val却的到了值8,而不是undefine,这是因为解释器在没有在当前对象找到要找 的属性后,就会去检查这个对象的prototype,objectRef的prototype是MyObject1对象,这个对象有testNumber这个属性,所以val得到8这个值。
1 var val = objectRef.toString;
现在val是个function的引用,这个function是Object.prototype的property,由于MyObject1和MyObject2都没有定义toString这个property 所以Object.prototype返回。
1 var val = objectRef.madeUpProperty;
最后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,例如:
1 var o = {};
2 Object.prototype.isPrototypeOf(o); //true: o.constructor==Object;
3 Object.isPrototypeOf(o); //false
4 o.isPrototypeOf(Object.prototype); //false
5 Function.prototype.isPrototypeOf(Object); //true: Object.constructor == Function
判断是否原型对象的继承属性
Object.hasOwnProperty()方法用来区分继承的属性和对象的属性。
本节链接至:http://www.baidu.com/link?url=urLhG4zmUyJ-w2xDK74xADY4Ab0kRN6E8Lu2wJXCAq3AB51fzNmEooJlGjYvahnFw9wpx573mgmXhxekb_zSfvzoQwDdXcGNkRLg7GHhf-q&wd=&eqid=ea8aa48b000026740000000656614780
如有侵权请留言告知,本人立即删除。