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

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

2016-02-17 11:17 309 查看
上一篇文章我主要介绍的是在JavaScript里对象的创建,可是,在对象的创建过程中有很多知识我们还没有学习,那就是原型,原型式什么东东哪?在这里我想用自己的理解跟大家说说,有不对的地方大家可以给我提意见。

首先说,原型就是对象,这个对象中的属性和方法可以被共享,被谁共享哪?就是被实例们共享(当我们创建一个对象后,然后再用这个对象去实例化许多实例)。

我们创建的每个对象都有一个 prototype(原型)属性,这个属性是系统自动创建的,通过这个属性(prototype)就可以直接访问到该对象的原型对象。例子如下所示。

[javascript] view
plain copy

print?

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()对象的实例看看。

[javascript] view
plain copy

print?

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()方法(改变函数的作用域)

[javascript] view
plain copy

print?

<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()方法(对象冒充)

[javascript] view
plain copy

print?

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》——面向对象之继承。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: