原型模式
“使用特定原型实例来创建特定种类的对象,并且通过拷贝原型来创建新的对象”。
在创建比较复杂的对象的时候,使用ctrl+c和ctrl+v固然是一种方法,但是太粗暴,除非你想吹嘘你写代码的行数。
使用原型模式可以更方便的创建对象,通过编写一个clone函数,将创建对象的细节隐藏,就可以创建一个和被克隆对象一样的对象。比如想要生成大量小怪的时候,通过一个小怪的模板,就可以优雅地实现了~
原型语言
“面向对象编程”并不等同于“类”,基于原型的语言,也可以说是面向对象的,或者说是“真·面向对象”,因为它不管是属性和方法,都是在对象中的,一个实例包含状态和行为。通过对象去创建对象,这就是原型的世界。
原型语言的简单定义:
- 只有对象,没有类;对象继承对象,而不是类继承类。
- “原型对象”是核心概念。原型对象是新对象的模板,它将自身的属性共享给新对象。一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性。
- 每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统。root节点的顶层对象是一个语言原生的对象,只有它没有原型对象,其他所有对象都直接或间接继承它的属性。
Javascript
Javascript是基于原型的语言,在javascript中,每个对象可以有任意属性集合,它们可以是属性和方法,一个对象也能拥有其他对象。
和上面讲的稍有不同的是,javascript中没有一个方法可以用来克隆对象,如果你要在javascript中定义创建对象的方法,首先需要创建这样一个构造函数:
function Person(name) {
this.name = name;
}
当然还需要定义一些行为:
Person.prototype.getName = function(){
return this.name;
}
然后用下面的语法创建新的对象并初始化对象相应的属性:
var person = new Person("魔法少女");
当使用new关键字创建对象时,做了以下几件事:
- 调用Person方法,创建一个空对象,并且把this指针绑定到这个新创建的对象上。
- 创建一个指向Person.prototype的指针。
- Person方法给this对象添加了name属性。
- 将这个初始化属性的对象返回。
最后person就是一个包含原型对象和自身属性的一个对象了,当调用person.getName()时,最自动调用原型对象的对应方法。