您的位置:首页 > Web前端 > JavaScript

Javascript中的原型链

2015-11-05 21:50 495 查看
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的原型对象中,我们把这种链式的查询关系就称之为“原型链”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: