设计模式之原型模式

原型模式概念

alt

原型模式(prototype)是创建型模式的一种,其特点在于通过「复制」一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的「原型」,这个原型是可定制的。

原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

真正的原型继承是作为最新版的ECMAScript5标准提出的,使用Object.create方法来创建这样的对象,该方法创建指定的对象,其对象的prototype有指定的对象(也就是该方法传进的第一个参数对象),也可以包含其他可选的指定属性。例如Object.create(prototype, optionalDescriptorObjects)

Show code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 因为不是构造函数,所以不用大写
var girl = {
name:'郝阿由',//小孩的姓名
weight:'7斤八两' //小孩的体重
};
// 使用Object.create创建一个女孩
var bady = Object.create(girl);
bady.name = '郝美丽';
Object.create运行你直接从其它对象继承过来,使用该方法的第二个参数,你可以初始化额外的其它属性。例如:
var girl = {
create: function () {
return "小孩的名字是"+this.name+"小孩的体重是"+this.weight;
};
};
var bady = Object.create(girl, {
'name': {
value:"郝美丽",
enumerable: true // 默认writable:false, configurable:false
},
'weight': {
value: '7斤八两',
enumerable: true
}
});

这里,可以在Object.create的第二个参数里使用对象字面量传入要初始化的额外属性,其语法与Object.defineProperties或Object.defineProperty方法类型。它允许您设定属性的特性,例如enumerable, writable 或 configurable。

  • 如果你希望自己去实现原型模式,而不直接使用Object.create 。结合构造函数模式,把上面的代码重新实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function Baby(data){
if(!(this instanceof Baby)){
return new Baby(data);
}
this.name=data.name||'郝阿由'; //小孩的姓名
this.weight=data.weight||'7斤八两'; //小孩的体重
}
Baby.prototype.create= function () {
return "小孩的名字是"+this.name+"小孩的体重是"+this.weight;
};
var baby=new Baby({});
console.log( baby.create());