上一篇文章我主要介绍的是在JavaScript里对象的创建,可是,在对象的创建过程中有很多知识我们还没有学习,那就是原型,原型式什么东东哪?在这里我想用自己的理解跟大家说说,有不对的地方大家可以给我提意见。
首先说,原型就是对象,这个对象中的属性和方法可以被共享,被谁共享哪?就是被实例们共享(当我们创建一个对象后,然后再用这个对象去实例化许多实例)。
我们创建的每个对象都有一个 prototype(原型)属性,这个属性是系统自动创建的,通过这个属性(prototype)就可以直接访问到该对象的原型对象。例子如下所示。
function Box() {} //声明一个构造函数 Box.prototype.name = '美女'; //在原型里添加属性 Box.prototype.age = 20; Box.prototype.run = function () { //在原型里添加方法 return this.name + this.age + '看我这...'; };
其中Box.prototype代表访问到了Box()对象的原型,Box.prototype.age=20,表示给Box()的原型对象的age属性赋值为20。现在,声明两个Box()对象的实例看看。
var box1 = new Box(); var box2 = new Box(); alert(box1.run == box2.run); //返回true,说明它俩的run引用地址是一样的。
从上面的图中可以看出,实例box1和box2,都能通过构造函数对象Box去访问Box prototype,而Box prototype中放的一些方法和属性就是被box1和box2所共享的。
prototype 下有两个方法:apply()和 call(),每个函数都包含这两个非继承而来的方法。 这两个方法的用途都在特定的作用域中调用函数, 实际上等于设置函数体内 this 对象的值。 我的理解是一个是传参数用的对象冒充,一个是改变函数的作用域。对象冒充我的理解是指A对象冒充B对象后,A对象就会拥有B对象的属性或者方法,但是B对象引用类型的属性和方法不能被冒充。其实call()和apply()方法的作用是一样的,这里我只介绍一下call()方法。
1、原型的call()方法(改变函数的作用域)
<span style="color:#000000;">var color = '红色的'; //或者 window.color = '红色的';也行 var box = { color : '蓝色的' }; function sayColor() { alert(this.color); } sayColor(); //作用域在 window 返回红色的。 sayColor.call(this); //作用域在 window返回红色的。 sayColor.call(window); //作用域在 window 返回红色的。 sayColor.call(box); //作用域在box对象内 返回蓝色的。</span>
2、原型的call()方法(对象冒充)
function Box(name,age){ this.name=name; this.age=age; run=function(){ return this.name+this.age+"看我这....."; } } function Desk(name1,age1){ Box.call(this,name1,age1); //对象冒充调用,在这里也是传递参数的作用。 } var a =new Desk('刘亦菲',15); alert(a.name); //返回刘亦菲 alert(a.age); //返回15 alert(a.run()); //无返回值,因为这是引用类型,不能使用对象冒充调用,如果想调用,需要将new Box()赋值给Desk的原型代码如下 //Desk.prototype=new Box() //此方法是将对象Box()的实例和原型的信息全部赋值给Desk对象。
另外, 原型模式是有执行流程:1、先查找构造函数实例里的属性或方法,如果有,立刻返回;2、如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回。这里就不在匹配例子了。
小结
使用传递参数的构造函数创建实例,可以使不同的实例初始化不同的值,原型在对象的继承中也起到了很大的作用,如果想知道原型在对象的继承起到的作用,请看我的下一篇博客,《JavaScript》——面向对象之继承。
版权声明:本文为博主原创文章,未经博主允许不得转载。