# 前言
本片主要讲解创建对象各种方式的优缺点,本文更像是笔记,因为红宝书写的太好了。
# 工厂模式
function createPerson(name) {
var o = new Object()
o.name = name
o.getName = function() {
console.log(this.name)
}
return o
}
var person = createPerson('Tom')
- 缺点:对象无法识别,因为所有的实例都指向一个原型。
# 构造函数模式
function Person(name) {
this.name = name
this.getName = function() {
console.log(this.name)
}
}
var person = new Person('Tom')
优点:实例可以被归类为一类
缺点:每次创建实例时,每个方法都要被创建一次
# 优化
function Person(name) {
this.name = name
this.getName = getName
}
function getName() {
console.log(this.name)
}
var person = new Person('Tom')
优点:解决了每个方法都要被重新创建的问题
缺点:这叫啥封装...
# 原型模式
function Person(name) {}
Person.prototype.name = 'Tom'
Person.prototype.getName = function() {
console.log(this.name)
}
var person = new Person()
优点:方法不会被重新创建
缺点:
- 所有的属性和方法都共享
- 不能初始化参数
# 优化1
function Person(name) {
}
Person.prototype = {
name: 'kevin',
getName: function () {
console.log(this.name);
}
};
var person1 = new Person();
- 优点:封装看起来好一点
- 缺点:重写了原型,丢失了 constructor
# 优化2
function Person(name) {
}
Person.prototype = {
constructor: Person,
name: 'kevin',
getName: function () {
console.log(this.name);
}
};
var person1 = new Person();
- 优点:实例可以通过 constructor 找回构造函数
- 缺点:原型模式该有的缺点一个没少
# 组合模式
function Person(name) {
this.name = name;
}
Person.prototype = {
constructor: Person,
getName: function () {
console.log(this.name);
}
};
var person1 = new Person();
- 优点:该共享的共享,该私有的私有,使用最广泛的模式
- 缺点:封装性看起来看起来差点