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

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

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

时间: 2024-10-19 07:24:41

关于对象+原型+继承(二)的相关文章

关于js的对象原型继承(二)

本章讨论使用new一个构造函数来创建一个对象. 前期知识点说明: 1.prototype是函数的一个属性,每个函数都有一个prototype属性.这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. 2.__proto__是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,__proto__是对象的内置属性),是JS内部使用寻找原型链的属性. 首先上代码: //构造函数 function Cat(name) { this.name=name||'某只猫'; this

关于js的对象原型继承

javascript中,对象的继承是通过原型去继承. 可以这样理解:js中的对象,包含的除了属性和方法,还有一个最基本的原型__proto__对象.这个原型__proto__指向谁,这个对象就继承谁.这是最容易理解对象原型继承的一种方式. 如下面的代码: var student={ name:'zhangsan', age:21, run:function(){ return this.name+' is running!'; } }; var xiaoming={ name:'xiaoming

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

看下面例子: 1 var a={ 2 x:2, 3 getNumber:function(z){ 4 return this.x+this.y+z; 5 } 6 } ; 7 8 9 var b={ 10 y:23, 11 __proto__:a; 12 //表示对象b继承至对象a;__proto__属性为为对象自身隐含属性 13 } ; 14 15 b.getNumber(4);//输出29 如果调用ES5标准化的实现原型继承的可选方法  var b=Object.create(a);//对象b

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

先看几个例子: 1 function a(name,color){ 2 this.name=name; 3 this.color=color; 4 this.geta=function() { 5 return('this is a'); 6 } 7 } 8 a.prototype.price=-100; 9 a.prototype.rating=3; 10 a.prototype.getb=function(){ 11 return ("this is another a"); 12

原型,原型对象,原型链,构造函数,继承(二)

1.prototype(原型对象)有一个属性叫做constructor,constructor默认指向prototype(原型对象)所在的构造函数 2.constructor属性是定义在prototype上的,那就意味着可以被实例对象所继承 3.可以使用hasOwnProperty 方法来验证一个属性是自己的还是继承过来的 4.constructor的作用: 作用一:分辨原型对象到底属于哪个构造函数 instanceof() 作用二:可以从一个实例对象创建另一个实例对象 var Fun = fu

原型,原型对象,原型链,构造函数,继承(一)

前言:javascript中 万物皆对象 , 但是对象是有区别的 分为普通对象(object)和函数对象(function): ①由以下三种形式创建的对象为函数对象: function fun1(){} var fun2 = function(){} var fun3 = new Function(); console.log(typeof fun1);//function console.log(typeof fun2);//function console.log(typeof fun3);

原型继承+原型链 + 对象继承发展

一.原型继承: 1.说起原型继承,就要先由构造函数创造对象说起,首先了解构造函数内部基本原理: (1).在函数体最前面隐式的加上this = {} (2).执行 this.xxx = xxx; (3).隐式的返回this 并且要注意隐士创建的this对象中有个名为__proto__的属性,其属性值为该构造函数继承的原型prototype. 而原型对象的有一个名为constructor的属性,其属性值为继承之的构造函数, 所以可以通过这两个属性相互查看 2.原型的定义及一些特点: a.定义:原型是

js最好的继承机制:用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。

js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) {//在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性 ClassA.call(th

javascript对象创建及原型继承的研究

今天总结了下javascript关于原型继承和对象创建方面的东西,因为javascript的原型继承在使用传统面向对象语言开发的同学看来比较怪异,原型继承确实比传统OOP语言的继承理解和运用起来困难一些,当然个人觉得传统OOP的继承相对比较简单,因为中规中矩. 下面逐个的用示例说明javascript中对象创建方式,专业一点叫什么模式,主要有直接单个创建:工厂模式:提出方法类函数公用方式:构造函数模式:构造函数+原型方式:使用原型本质的方式构建(这种受过李站的<悟透javascript>一书的