关于对象+原型+继承(二)

每个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

如有侵权请留言告知,本人立即删除。

原文地址:https://www.cnblogs.com/pm-dongjian/p/5019950.html