美文网首页
创建对象的方法有哪些?

创建对象的方法有哪些?

作者: xiaolizhenzhen | 来源:发表于2016-12-27 17:30 被阅读0次

    1、工厂模式创建对象

        //外部创建
            // function Car(model,color){
            //  this.model = model;
            //  this.color = color;
            // }
            function factory(model,color){
                //内部创建
                function Car(model,color){
                    this.model = model;
                    this.color = color;
                }
                var o = new Car(model,color);
                return o;
            }
    

    使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型)

    2、构造函数创建对象

        function Car(model,color){
                this.model = model;
                this.color = color;
                this.run = function(){
                    console.log(this.model + "跑~");
                }
            }
            var c1 = new Car("x1","blue");
            var c2 = new Car("x2","red");
            c1.run();
            c2.run();
        console.log("构造函数"+c1.run == c2.run);
        //false表示两个不同的函数对象
    
    • 构造函数创建对象缺点:
      函数是对象,c1,c2是不同的两个对象,每次new都会创建一个对象,并且每个方法都有在每个实例上重新创建一遍,占内存占空间
    • 解决方法:原型方式创建对象

    注意:构造函数其实和普通的函数没有太大的差别,唯一的不同在于调用方式的不同。

    3、原型创建对象

            function Apple(name){
                this.name = name;
            }
            Apple.prototype.eat = function(){
                console.log(this.name + "被吃了");
            }
            var a1 = new Apple("红苹果");
            var a2 = new Apple("青苹果");
            a1.eat();
            a2.eat();
            console.log("原型:"+a1.eat == a2.eat);
            //true两个对象指向同一个内存区域,省内存
    

    原型模式也不是没有缺点,首先,它省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得了相同的属性值,这样非常不方便,但这还是不是原型的最大问题,原型模式的最大问题在于共享的本性所导致的,由于共享,因此因此一个实例修改了引用,另一个也随之更改了引用。因此我们通常不单独使用原型,而是结合原型模式与构造函数模式。

    4、工厂模式+字面量创建对象

        //var obj = {} 等同于 var obj1 = new Object();
        function ObjectFactory(m,s){
            var o = new Object();
            o.model = m;
            o.size = s;
            return o;
        }
        var c1 = ObjectFactory("t420",14);
        var c2 = ObjectFactory("M920",15);
        var c3 = ObjectFactory("G520",10);
        var c4 = ObjectFactory("K496",13);
        console.log(c1 == c2);//false
    

    5、混合模式(原型模式 + 构造函数模式)

    function Blog(name, url, friend) {
      this.name = name;
      this.url = url;
      this.friend = friend;
    }
    Blog.prototype.alertInfo = function() {
      alert(this.name + this.url + this.friend);
    }
    var blog = new Blog('wuyuchang', 'http://tools.jb51.net/', ['fr1', 'fr2', 'fr3']);
    var blog2 = new Blog('wyc', 'http://**.com', ['a', 'b']);
    blog.friend.pop();
    blog.alertInfo();  
    // wuyuchanghttp://tools.jb51.net/fr1,fr2
    blog2.alertInfo(); 
    // wychttp://**.coma,b
    

    混合模式中构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。每个实例都会有自己的一份实例属性,但同时又共享着方法,最大限度的节省了内存。另外这种模式还支持传递初始参数。优点甚多。这种模式在ECMAScript中是使用最广泛、认同度最高的一种创建自定义对象的方法。

    6、动态原型模式

    function Blog(name, url) {
      this.name = name;
      this.url = url;
      if (typeof this.alertInfo != 'function') {
        // 这段代码只执行了一次
        alert('exe time');
        Blog.prototype.alertInfo = function() {
          alert(thia.name + this.url);
        }
      }
    }
    var blog = new Blog('wuyuchang', 'http://tools.jb51.net');
    var blog2 = new Blog('wyc', 'http:***.com');
    

    动态原型模式将所有信息封装在了构造函数中,而通过构造函数中初始化原型(仅第一个对象实例化时初始化原型),这个可以通过判断该方法是否有效而选择是否需要初始化原型。可以看到上面的例子中只弹出一次窗,'exe time',即当blog初始化时,这样做blog2就不在需要初始化原型,对于使用这种模式创建对象,可以算是perfect了。

    相关文章

      网友评论

          本文标题:创建对象的方法有哪些?

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