工厂模式
function createPerson(name){
var o = new Object();
o.name = name;
o.getName = function(){
console.log(this.name);
};
return o;
}
var person = createPerson('johe');
缺点:对象无法识别,都指向一个原型Object,并且每个实例的getName函数的引用地址不同
构造函数模式
function Person(name){
this.name = name;
this.getName = function(){
console.log(this.name);
}
}
var person1 = new Person('johe');
优点:实例可以识别为一个特定的类型,都指向Person.prototype
缺点:每次创建实例时,getName方法都要被创建一次,即每个实例的getName函数的引用地址不同
构造函数优化
function Person(name){
this.name = name;
this.getName = getName
}
function getName(){
console.log(this.name)
}
优点:所有getName都指向一个地址
缺点:封装不好
原型模式
function Person(name){
}
Person.prototype.name = 'johe'
Person.prototype.getName = function(){
console.log(this.name);
}
var person1 = new Person()
优点:方法不会被重新创建
缺点:所有属性和方法都共享(实例修改属性会影响到其他实例),并且不能初始化参数
原型模式优化
function Person(name){
}
Person.prototype = {
constructor:Person,
name:'johe',
getName:function(){
console.log(this.name)
}
}
var person1 = new Person()
与原型模式相比,封装性好了一点
组合模式
构造函数模式和原型模式双剑合璧
function Person(name){
this.name = name;
}
Person.prototype = {
constructor:Person,
getName:function(){
console.log(this.name)
}
}
优点:属性不会被共享,方法共享,即构造函数内初始化实例属性和方法,原型内初始化共享属性和方法
缺点:封装性不够好
网友评论