由于今天有点事,加上对象原型链的东西有点多,所以今天这篇就讲一个小的知识点吧
也算为明天的对象继承做铺垫
工厂模式
虽然使用对象字面量来创建一个对象十分地便捷,但是这个方法有一个显著的缺点
那就是如果我们需要为一个接口创建多个对象,那么将会产生大量的重复代码
所以工厂模式氤氲而生
所谓工厂模式,也就是让我们的代码成为一个工厂,通过这个工厂我们可以源源不断地产生同一产品
其大体实现如下
function createPerson(age,job,name){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(o.name); } return o; }
通过上面这样一种方式我们就可以很便捷地生成一种具有三个属性一个方法的对象
虽然这种方法解决了重复代码的问题,但是还有一个问题,对于多个相似的对象我们如何识别对象类型的问题
也就是说这样的方式我们没法判断对象的类型
构造函数模式
刚才的问题,构造函数模式就是答案
通过该模式我们就可以使用 instanceof 操作符来判断一个对象的类型
以刚才的工厂模式创建的对象举例
其构造函数模式基本实现如下:
function Person(age,job,name){ this.age =age; this.name = name; this.job = job' this.sayName = function(){ alert(this.name); } }
这种方法在使用上也与工厂模式有所区别,工厂模式实际上就是封装了创建一类对象的函数
而构造函数模式不能直接调用,如果直接调用将会为全局对象(window)创建age、name、job、sayName几个属性
要使用 new 操作符来进行调用
new操作符实现的功能在前几篇文章中已经详细介绍了
这里就不再赘述
原型模式
虽然构造函数解决了识别对象类型的问题
但是还有一个问题,拿刚才的例子来说,构造函数为每一个实例都创建了一个sayName的函数
而实际上这一步骤是没有必要的
这样如果创建了大量实例的情况下,会占用浏览器大量的内存
为了解决这一问题,原型模式诞生了
由于这里会涉及到原型链相关的东西,具体内容留到明天详细介绍