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自行驗證;

   當然,構造函數模式也有缺點: 如果構造函數裏邊寫了一個方法,那麼每個實例都會創建該方法,也就是說,不同實例上的同名方法是不相等的。那麼如果這些方法要實現相同的功能,這就顯得很累贅了。

   解決辦法:將方法定義爲全局函數,在構造函數裏邊調用函數,這樣就可以所有實例共享同一個方法了。而不需要分別創建;

   帶來新問題:如果需要很多方法,那麼就需要定義很多全局函數,這嚴重影響封裝性,所以爲了解決這個問題,引入了原型模式(詳情請參考中篇);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章