Javascript对象原型prototype和继承
2010-01-30 17:13
711 查看
每个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()方法用来区分继承的属性和对象的属性。
相关文章:Javascript的关键字this详解
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()方法用来区分继承的属性和对象的属性。
相关文章:Javascript的关键字this详解
相关文章推荐
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- javascript 对象及原型继承有关的属性:constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty 等等
- 从0开始学react netive:2.Javascript创建对象的方式_prototype原型的概念_原型继承
- Javascript对象原型prototype和继承
- 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)
- javascript 面向对象全新理练之原型继承
- 用一张简单的图理解JavaScript对象的prototype原型
- javascript当中的代码嗅探扩展原生对象和原型(prototype)
- JavaScript面向对象编程之prototype原型与继承
- 史上最通俗易懂的关于JavaScript 的 prototype、原型继承、this指针的讲解
- javascript 对象 与 prototype 原型
- JavaScript为对象原型prototype添加属性的两种方式
- JavaScript高级之prototype原型继承
- javascript原型继承分析(prototype)
- JavaScript 原型对象的继承方法
- JavaScript原型对象prototype
- javascript中的原型(prototype)及原型链的继承方式
- [js高手之路]一步步图解javascript的原型(prototype)对象,原型链
- Javascript原型与继承【prototype】