Prototype-Pattern(原型模式)

原型模式(Prototype Pattern):是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性。这种类型的设计模式属于创建型模式
在js中原型设计模式的使用要比java、C中要简单的多。

1、Object.create()

1、定义: 创建一个可指定原型对象的并可以包含可选自定义属性的对象;
2、 Object.create(proto [, properties]); 可选,用于配置新对象的属性;

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
28
29
30
31
32
33
34
35
36
37
方法说明
1. proto: 要创建新对象的 原型,必须,可为 null; 这个 proto 要是已经创建的[new过],或 对象.prototype 才有价值;

2. properties: 可选,结构为:

{

     propField: {

           value: 'val'|{}|function(){},

           writable: true|false,

           enumerable: true|false,

           configurable: true|false,

           get:function(){return 10},

           set:function(value){}

     }

}

自定的属性有以下的四种本置属性:

value: 自定义属性值;

writable: 该项值是否可编辑,默认为 false, 当为 true 时,obj.prodField 可赋值;否则只读;

enumerable: 可枚举;

confirurable: 可配置;
还可以包含 set, get 访问器方法;
其中,[set, get] 与 value 和 writable 不能同时出现;

示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
* 原型模式使用
* Object.create
* **/
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};

const me = Object.create(person);

me.name = 'Matthew'; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten

me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"

2、prototype 来创建对象变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/***
* 使用prototype来创建实例对象
* @param name
* @returns {createPerson.Person}
*/
function createPerson(name){
function Person(){
};

Person.prototype = person;
let newPerson = new Person();
newPerson.name = name;
return newPerson;
}


let me = createPerson("Matthew");
me.isHuman = true;

me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"

java版类图