Javascript中的原型链

1、关于原型对象

先看下面代码:

<script type='text/javascript'>
   //创建一个Person构造器
   function Person(){}
   //实例化一个Person类对象
   var p = new Person();
</script>

当系统加载Person构造器时,系统在内存中会自动生成一个对象,我们就称之为“原型对象”。构造器与原型对象之间表现为相对独立,不存在谁包含谁的关系,但是两者之间又有一定的联系:在Person构造器的内部存在一个prototype属性(可以理解为类的静态属性,由类名(在js中类名其实就是函数名)直接调用,如 函数名.prototype),其指向了Person的原型对象,在Person原型对象的内部也存在一个constructor属性,其指向了Person的构造器。

2、原型对象的作用

当Person构造器的实例化对象访问一个不存在的属性或方法时,系统首先到当前构造器的原型对象中去寻找,如找到,则直接使用:

<script type='text/javascript'>
   //创建一个Person构造器
   function Person(){}
   //实例化一个Person类对象
   var p = new Person();
   //访问对象p的constructor属性
   alert(p.constructor);
</script>

上面例子输出结果为:function Person(){} ,即Person构造器。

我们在定义p对象时,并没有为其动态添加constructor属性,但是这里却可以正常弹出Person构造器,如何解释呢?

由于上面第1点已经说了,在加载构造器的时候会生成一个原型对象,而构造器中存在一个属性(可以理解为静态属性),它正是指向这一个原型对象,反过来,该原型对象中又存在一个constructor属性,指向了该构造器,所以虽然我们并没有为对象p设置一个属性constructor,但是当我们访问p.constructor的时候,由于构造器中不存在constructor属性,那么系统将会到prototype属性所指向的原型对象中寻找constructor属性,而这个constructor属性又指向了构造器,所以最终可以输出function Person(){}。

3、通过下面程序可以证明constructor与prototype是互相指向关系

<script type='text/javascript'>
   //创建一个Person构造器
   function Person(){}
   //实例化一个Person类对象
   var p = new Person();
   //访问对象p的constructor属性
   alert(p.constructor.prototype.constructor.prototype.constructor);
</script>

结果发现,依然可以弹出function Person(){}构造器,由此证明了constructor与prototype是互相指向的关系

4、原型对象应用场景

在实际项目开发中,我们通常使用别人开发好的类或框架,当我们发现其内部缺少我们需要的属性或方法时,不能直接修改源代码,可以通过原型对象对其进行扩充。

<script type='text/javascript'>
   //创建一个Person构造器
   function Person(){
        this.name = "zhangsan";
        this.age = 20;
   }
   //实例化一个Person类对象
   var p = new Person();
   //通过原型对象扩充原有对象的属性
   Person.prototype.score = 100;
   alert(p.score);
</script>

结果弹出 100.

在实际应用中也可以用于扩充系统类对象,如下:

<script>
	//定义一个变量
	var i = 10;
	//扩充Number类的原型对象
	Number.prototype.sum = function() {
		//特殊的对象arguments
		var total = 0;
		for(var i=0;i<arguments.length;i++) {
			total += arguments[i];
		}
		return this+total;
	}
	//通过sum函数求和
	alert(i.sum(20,30,40,50));
</script>

结果弹出 150

5、原型对象的由来
原型对象也是一个对象,其肯定是由某个类实例化而来。原型对象在生成过程中,都需要执行以下步骤:
类.prototype(原型对象) =  new Object();

当Person构造器的实例化对象p访问一个不存在的属性或方法时,系统首先到Person构造器的原型对象中去寻找,又由于Person原型对象是Object类的实例,当系统加载Object构造器的同时也会生成Object原型对象,基于原型对象的原则,当p对象找不到相关属性或方法,首先到Person原型对象中去寻找,如找不到会继续向上一级原型对象中去寻找,直到Object的原型对象中,我们把这种链式的查询关系就称之为“原型链”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值