在将工厂模式之前,先讲讲工厂模式出现之前是如何创造一个对象的
1.创建 Object 的实例,然后在为他添加属性,这也是最早创建对象的方式。
1 2 3 4 5 6
| var person = new Object(); person.name = 'leizore' person.age = 25; person.sayName = function () { alert(this.name); }
|
2.字面量创建
1 2 3 4 5 6 7
| var person = { name: 'leizore', age: 25, sayName = function () { alert(this.name); } }
|
工厂模式的诞生就是为了减少创建对象的重复
1 2 3 4 5 6 7 8 9 10 11
| function (name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = function () { alert(this.name); } return obj; }
大专栏 设计模式pan class="line">var person1 = createPerson('jack', 22); var person2 = createPerson('tom', 25);
|
工厂模式虽然不用重复大量的代码来创建对象,但是创建出来的对象毫无联系,也就是说没有解决对象识别问题(怎样知道一个对象的类型),随着javascript的发展,有一个新的模式出现了,我们叫构造函数模式。
1 2 3 4 5 6 7 8 9
| function Person (name, age) { this.name = name; this.age = age; this.sayName = function () { alert(this.name); } } var person1 = new Person('jack', 22); var person2 = new Person('tom', 25);
|
可以看出 Person 函数与 createPerson 函数不同之处在于:
- Person 函数内部没有显示创建对象
- 直接将属性和方法赋给了this
- 没有return语句
对比可以发现,之所以不同是因为 Person 函数用了 new 操作符,那么使用 new 到底做了什么呢
- 创建一个对象
- 将作用域this指向新创建的对象
- 返回新对象
使用new操作符创建出来的对象是跟构造函数有着斩不断的联系的,这个“脐带”就是 constructor
1 2
| console.log(person1.constructor === Person) console.log(person2.constructor === Person)
|
创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型;而这正事构造函数模式胜过工厂模式的地方
设计模式
原文:https://www.cnblogs.com/lijianming180/p/12099636.html