创建对象的方法有哪些?

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了。

你可能感兴趣的:(创建对象的方法有哪些?)