创建对象
一、工厂模式其实就是函数封装:
步骤:
(1)在工厂里面去写方法;
(2)在外部写一个公用的方法去调用工厂函数独有的方法
function createPerson(name){
(1)原料
var o = new Object ();
(2)加工
o.name = name;
o.sayName = function (){
alert(this.name)
}
(3)出场
return o;
}
var person1 = createPerson("Ni");
var person2 = createPerson("psx")
//工厂函数虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎么样知道一个对象的类型,因为工厂函数中,所有的函数都是Object的实例,这样的判断没有多大的意义;而在构造函数里面,构造出来的函数不仅仅是Object,也是构造函数的实例,而构造函数是我们自定义的,自定义一个新的对象类型),而构造函数可以用来创建特定类型的对象)
二、构造函数
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型,这是构造函数胜过工厂模式的地方
构造函数的问题:使用构造函数,每个方法都要在每个实例上重新创建一遍,因此每定义一个函数,也就是实例化一个对象。不同实例上的同名函数是不相等的,创建两个完成同样任务的函数是没有必要的;
可以通过原型模式来解决以上的问题。
三、原型模式
创建的每个函数都有一个prototype(原型)属性,每个构造函数都有一个原型对象Person.prototype,原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针[[prototype]]
prototype:是一个指针,指向Person.prototype原型对象(该对象的用途是包含可以由特定类型的所有实例共享的属性和方法)
constructor:创建了自定义的构造函数之后,其原型对象默认只会取得construtor属性;至于其他方法,则是从Object继承而来的。
[[prototype]]:当调用构造函数创建一个新实例后,该实例的内部将包含一个指针[[prototype]],指向构造函数的原型对象
_proto_:该链接只存在域实例与构造函数的原型对象之间,不存在于实例与构造函数之间
使用原型对象的好处就是可以让所有的对象实例共享它所包含的属性和方法