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自行驗證;
當然,構造函數模式也有缺點: 如果構造函數裏邊寫了一個方法,那麼每個實例都會創建該方法,也就是說,不同實例上的同名方法是不相等的。那麼如果這些方法要實現相同的功能,這就顯得很累贅了。
解決辦法:將方法定義爲全局函數,在構造函數裏邊調用函數,這樣就可以所有實例共享同一個方法了。而不需要分別創建;
帶來新問題:如果需要很多方法,那麼就需要定義很多全局函數,這嚴重影響封裝性,所以爲了解決這個問題,引入了原型模式(詳情請參考中篇);