《JavaScript》——面向对象之原型

来源:互联网 发布:2016网络经典小说 编辑:程序博客网 时间:2024/04/29 11:36

    上一篇文章我主要介绍的是在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);                         //返回15alert(a.run());                       //无返回值,因为这是引用类型,不能使用对象冒充调用,如果想调用,需要将new Box()赋值给Desk的原型代码如下//Desk.prototype=new Box()            //此方法是将对象Box()的实例和原型的信息全部赋值给Desk对象。

    另外, 原型模式是有执行流程:1、先查找构造函数实例里的属性或方法,如果有,立刻返回;2、如果构造函数实例里没有,则去它的原型对象里找,如果有,就返回。这里就不在匹配例子了。

   小结

   使用传递参数的构造函数创建实例,可以使不同的实例初始化不同的值,原型在对象的继承中也起到了很大的作用,如果想知道原型在对象的继承起到的作用,请看我的下一篇博客,《JavaScript》——面向对象之继承。

 

1 0
原创粉丝点击