关于对象原型prototype
文章目录

定义和用法

prototype 属性使您有能力向对象添加属性和方法。

实例

在本例中,我们将展示如何使用 prototype 属性来向对象添加属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function employee(name,job,born)
{
this.name=name;
this.job=job;
this.born=born;
}

var bill=new employee("Bill Gates","Engineer",1985);

//设置对象原型的一个属性
employee.prototype.salary=null;
bill.salary=20000;

document.write(bill.salary);

输出:

1
2000

相关问题

对象原型使用中出现的问题

  1. 无法保持独立
  2. 信息共享
  3. 无法传参
  4. 两个属性相同改变
1
2
3
4
5
6
7
8
9
10
11
12
function Car() {
}

Car.prototype.drivers = new Array("Mike","John");

var oCar1 = new Car();
var oCar2 = new Car();

oCar1.drivers.push("Bill");

alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John,Bill"

oCar1.drivers实际上操作的是Car.prototype.drivers,因此一次性修改了所有对象的内容

Solution

混合的构造函数/原型方式
实际上只需要保证原型方式的调用路径里面不会有实际数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Car(sColor) {
this.color = sColor;
this.drivers = new Array("Mike","John");
}

//也可以把这段放到上方定义中,就不必写调用原型,减少指针数目方便管理
Car.prototype.showColor = function() {
alert(this.color);
};

var oCar1 = new Car("red");
var oCar2 = new Car("blue");

oCar1.drivers.push("Bill");

alert(oCar1.drivers); //输出 "Mike,John,Bill"
alert(oCar2.drivers); //输出 "Mike,John"

Solution2

动态原型方法

1
2
3
4
5
6
7
8
9
10
11
12
13
function Car(sColor) {
this.color = sColor;
this.drivers = new Array("Mike","John");

//这一段的用途是判断是否已经设定过原型变量了,如果设定过了就不再重新设定,防止多次设定导致数据共享错误
if (typeof Car._initialized == "undefined") {
Car.prototype.showColor = function() {
alert(this.color);
};

Car._initialized = true;
}
}