本文首发于我的个人博客 ruiqima.com
原文链接:JS 创建对象模式
工厂模式
本质:用函数封装创建对象的细节。
特点:
- 显式创建了对象(如
Object
) - 不使用
new
- 有
return
语句 - 缺点:没有解决对象识别问题,即怎样知道一个对象的类型。(如代码倒数第二行的
false
)
function createPerson(name, age) {
var o = new Object()
o.name = name
o.age = age
o.sayName = function () {}
return o
}
var person = createPerson('Joker', 23)
console.log(person instanceof createPerson) // false
console.log(person.__proto__) //{}
构造函数模式
特点:
- 没有显式创建对象
- 直接将属性和方法赋给了
this
对象 - 没有
return
语句 - 创建新实例需使用
new
操作符 - 可以解决工厂模式不能确定对象类型的问题
- 缺点:会导致不同实例中的方法不是同一个
Function
实例,导致不同的作用域链和标识符解析。(同一个名为sayName
的方法在不同实例中是不同Function对象)(如代码倒数第三行的false
)
function Person(name, age) {
this.name = name
this.age = age
this.friends = ['1', '2']
this.sayName = function () {}
}
var person1 = new Person('Joker', 23)
var person2 = new Person('Joker1', 24)
person1.friends.push('3')
console.log(person1.friends) //[ '1', '2', '3' ]
console.log(person2.friends) //[ '1', '2' ]
console.log(person1.sayName === person2.sayName) //false
console.log(person1 instanceof Person) //true
console.log(person