JavaScript中创建对象的方法(上)

JavaScript中创建对象的方式:

一、工厂模式

    所谓工厂模式就是将对象的属性或者方法当做参数传给一个函数,该函数返回具有相应属性和方法的对象。实例如下:

    function createPerson(name, age, sex) {
        var o = {};
        o.name = name;
        o.age = age;
        o.sex = sex;
        return o;
    }
    var person1 = createPerson('张三', '54', '男');
    var person2 = createPerson('李四', '25', '男');
    console.log(person1.name);//张三
    console.log(person2.name);//李四

二、构造函数模式

用构造函数来创建特定类型的的对象,这一方法和C++中创建对象的方法类似,实例如下:

    function Person(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    var person3 = new Person('王五', '54', '男');
    var person4 = new Person('马六', '25', '男');
    console.log(person3.name);//王五
    console.log(person4.name);//马六

这里有两点需要注意:
    1、person函数首字母大写,用以区分构造函数和非构造函数;
    2、person3和person4分别保存着Person的一个不同实例,他们都默认有一个constructor(构造函数)属性,且都指向Person,测试如下:

    console.log(person3.constructor === Person);//true
    console.log(person4.constructor === Person);//true

  和工厂模式相比,构造函数模式最大的优势在于:自定义的构造函数将来可以将他的实例标识为一种特定的类型;即,person3和person4是Object类型也是Person类型,可以用instanceof自行验证;

   当然,构造函数模式也有缺点: 如果构造函数里边写了一个方法,那么每个实例都会创建该方法,也就是说,不同实例上的同名方法是不相等的。那么如果这些方法要实现相同的功能,这就显得很累赘了。

   解决办法:将方法定义为全局函数,在构造函数里边调用函数,这样就可以所有实例共享同一个方法了。而不需要分别创建;

   带来新问题:如果需要很多方法,那么就需要定义很多全局函数,这严重影响封装性,所以为了解决这个问题,引入了原型模式(详情请参考中篇);

猜你喜欢

转载自blog.csdn.net/u013910340/article/details/70492086