对象字面量的方式不能量产“同类”对象。
1. 工厂模式
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.printName = function() {
console.log(this.name);
}
return o
}
var person1 = createPerson('Richard', 21, 'Engineer');
var person2 = createPerson('Gary', 19, 'Fool');
评价:解决了创建相似对象的问题,但无法识别对象的类型。
2. 构造函数模式
function Person(name, age, job) {
this.name = name
this.age = age
this.job = job
this.printName = function() {
console.log(this.name)
}
}
var person1 = new Person('Terry', 21, 'Software Engineer')
var person2 = new Person('Jerry', 12, 'Doctor')
特点:
- 没有显示创建对象,直接将属性和方法赋值给了this对象;没有return语句
- 自定义的构造函数实例化后的实例属于该特定类型(即instanceof值为该构造函数)
使用new调用构造函数时发生的事儿:
- 创建一个新的对象
- 将构造函数的作用域赋给上述新对象,即this指向该新对象
- 执行构造函数中的代码(为新对象添加属性和方法)
- 返回新对象
缺点:如上示例中,person1与person2的printName属性并非同一个,即使功能相同,即不能共享函数或属性。
3. 原型模式
每个函数都有一个prototype属性,该属性是一个指向原型对象的指针。
而这个“原型对象”的用途就是用来共享属性和方法的。
function Person() {
}
Person.prototype.name = 'Zed'
Person.prototype.age = 21
Person.prototype.job = 'driver'
Person.prototype.printName = function() {
console.log(this.name)
}
var person1 = new Person()
var person2 = new Person()
person1.printName()
如上所示:name, age, job, printName是所有Person实例所共享的
4. 组合使用构造函数模式与原型模式
构造函数用于定义实例属性,原型模式用于定义共享方法与共享属性。
function Person(name, age, job) {
this.name = name
this.age = age
this.job = job
this.friends = ['sheldon', 'penny']
}
Person.prototype = {
constructor: Person,
printName: function() {
console.log(this.name)
}
}
const Rajesh = new Person('Rajesh', '35', 'Astronomer')
const Howard = new Person('Howard', '36', 'Applied Physicist')
这种构建模式是目前使用最广泛、认同度最高的创建自定义类型的方法。可以说是定义引用类型的一种默认模式了。
5. 动态原型模式
该模式避免了 构造函数与原型的分离,将原型的定义封装在了构造函数中
function Person(name, age, job) {
this.name = name
this.age = age
this.job = job
if (typeof this.printName !== 'function') {
Person.prototype.printName = function() {
console.log(this.name)
}
}
}
6. 寄生构造函数模式
function Person(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.printName = function() {
console.log(this.name)
}
return o
}
const friend = new Person('Nite', 22, 'Noidea')
注意:寄生函数构造模式返回的对象与构造函数或者构造函数的原型属性间没有任何联系。也就是说,该模式返回的对象与在构造函数外创建的对象没什么不同,不指定对象类型。
使用场景:在不行改变Array数组原型的情况下添加额外方法,可用此模式。
7. 稳妥构造函数模式
Douglas Crockford发明了稳妥对象 (durable objects)
所谓稳妥对象,指的是没有公共属性,而且其方法不能引用this对象。适合在安全环境中使用。
与寄生构造函数模式的不同点:
- 新创建对象的实例方法不引用this
- 不适用new操作符调用构造函数
function Person(name, age, job) {
var o = new Object()
o.name = name
o.age = age
o.job = job
o.printName = function() {
console.log(name)
}
return o
}
不太明白啥意思 暂时也用不到吧,就这样吧!