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

时间:2022-02-17 18:58:42

    上一篇文章我主要介绍的是在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引用地址是一样的。


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

    从上面的图中可以看出,实例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》——面向对象之继承。