一篇就够-JS对象的多种创建方式

工厂模式

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)
    }
}

优点:属性不会被共享,方法共享,即构造函数内初始化实例属性和方法,原型内初始化共享属性和方法
缺点:封装性不够好

你可能感兴趣的:(一篇就够-JS对象的多种创建方式)