美文网首页
一篇就够-JS对象的多种创建方式

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

作者: johe_jianshu | 来源:发表于2020-03-24 19:14 被阅读0次

    工厂模式

    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对象的多种创建方式

          本文链接:https://www.haomeiwen.com/subject/rqeayhtx.html