工厂模式
工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。
1 function createBlog(name, url) { 2 var o = new Object(); 3 o.name = name; 4 o.url = url; 5 o.sayUrl= function() { 6 alert(this.url); 7 } 8 return o; 9 } 10 11 var blog1 = createBlog('wuyuchang', 'http://www.jb51.net/');
可以看到工厂模式的实现方法非常简单,解决了创建多个相似对象的问题,但是工厂模式却无从识别对象的类型,因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。
构造函数模式
ECMAScript中构造函数可以创建特定类型的对象,类似于Array、Date等原生JS的对象。其实现方法如下:
1 function Blog(name, url) { 2 this.name = name; 3 this.url = url; 4 this.alertUrl = function() { 5 alert(this.url); 6 } 7 } 8 var blog = new Blog('wuyuchang', 'http://www.jb51.net/'); 9 //即为Blog的实例,也为Object的实例 10 console.log(blog instanceof Blog); // true 11 console.log(blog instanceof Object); // true
构造函数与工厂函数之间差异:
1.工厂函数需要创建对象,以及必须有返回值
2.工厂函数针对的都是Object的对象模型,而构造函数可以匹配自定义的对象模型
即前者不论创建什么都只有一个xx instanceof Object
而后者根据自定义名而定类型,如上举例所示
3.构造函数弊端,如果在全局中定义相同的局部变量,容易造成全局污染,因为this.xx如果在局部获取不到,就会去全局中获取
4.构造函数可以重写,可以在全局中添加新属性和方法Person.prototype = {},但工厂函数只能在局部添加
各自适用场合:
构造函数:适应用于大型项目,属性以及方法时常变换的项目
工厂函数:适应用于小型项目,或者正在制作过程还没有成型的项目
参考了一些资料,以及个人的一点见解,希望能帮忙补充~~~