虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是这些方式有个明显的缺点:使用同一个接口创建很多对象,
会产生大量的重复代码,因此我们使用一种工厂模式的变体。
一、工厂模式:
例子:
createPerson()能够根据接受的参数来构建一个包含所有必要信息的person对象,可以无数次的
调用这个函数。工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题。
二、构造函数模式:
创建自定义的构造函数,从而定义自定义对象类型的属性和方法,
比如:
与工厂模式相比,存在不同之处:
1.没有显示的创建对象;
2.直接将属性和方法赋给了this对象;
3.没有return语句。
构造函数本身也是函数,只不过可以用来创建对象而已。
要创建Person的新实例,必须使用new操作符。以这种方式调用构造函数会经历以下四个步骤:
1.创建一个对象
2.将构造函数的作用域赋给新对象,(因此this就指向了这个新对象);
3.执行构造函数中的代码(为这个新对象添加属性);
4.返回新对象。
person1 和person2 分别保存着Person的一个不同的实例,这两个对象都有一个consructor(构造函数)属性,且该属性指向Person。
构造函数当做函数
三、原型模式
我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型
的所有实例共享的属性和方法。
使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法,也就是说不必在构造函数中定义对象实例的信息,而是可以将这些
信息直接添加到原型对象中。与构造函数模式不同的是,新对象的这些属性和方法是由所有的实例共享的。
虽然可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。如果我们在实例中添加一个属性,而该
属性与实例原型中的属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的那个属性。
添加的属性只会阻止我们访问原型中的那个属性,但是不会修改那个属性。即使这个属性设置为null也只会在实例中设置
这个属性,而不会恢复其指向原型的连接。不过通过delete操作符则可以完全删除实例属性,从而让我们能够重新访问原型中的
属性。