工厂模式
1 | function Factory(name){ |
缺点:对象无法识别,因为所有的实例都指向同一个原型。
构造函数模式
1
2
3
4
5
6
7function Person(name){
this.name = name;
this.getName = function(){
console.log(this.name)
}
}
var p1 = new Person('blue')优点:实力可以识别为一个特定的类型
缺点:每次创建实例时,每个方法都要被创建一次
构造函数模式优化
1
2
3
4
5
6
7
8function Person(name){
this.name = name;
this.getName = getName
}
function getName(){
console.log(this.name)
}
var p1 = new Person('blue')
优点: 解决了每个方法都要被重新创建的问题
原型模式
1 | function Person(name) { |
优点:封装新好一点
缺点:重写了原型,丢失了constructor属性
原型模式优化
1
2
3
4
5
6
7
8
9
10
11function Person(name) {
}
Person.prototype = {
constructor: Person,
name : 'blue',
getName: function(){
console.log(this.name)
}
}
var p1 = new Person()优点:实例可以通过constructor属性找到所构造函数
组合模式:最常用的
1
2
3
4
5
6
7
8
9
10function Person(name){
this.name = name;
}
Person.prototype = {
constructor= Person,
getName: function(){
console.log(this.name)
}
}
var p = new Person()优点:该共享的共享,该私有的私有,使用最广泛。
动态原型模式
1
2
3
4
5
6
7
8
9function Person(name){
this.name = name;
if(typeof this.getName != 'function'){
Person.prototype.getName = function(){
console.log(this.name)
}
}
}
var p = new Person()
使用动态原型模式不能用对象字面量写原型
1 | function Person(name) { |
这里就涉及到了new的底层执行过程
new的执行过程如下:
1. 首先新建一个对象
2. 将对象的原型指向Person.prototype
3. 然后返回Person.apply(obj)
4. 返回这个对象
通过下面的方式可以使用new来创建实例
1 | function Person(name) { |
寄生构造函数模式
1 | function Person(name) { |
与工厂函数一模一样,区别在于寄生模式使用new来构造实例而工厂模式是直接赋值。
稳妥构造函数模式
1 | function person(name){ |
稳妥对象,指的是没有公共属性,而且方法也没有用到this的对象,和寄生构造函数模式有两点不同:
1. 新创建的实例方法不引用this
2. 不适用new操作符调用构造函数