js中創建對象的方式有以下幾種:
- 工廠模式
示例1:
function creatPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = creatPerson('liming',18,'student');
函數creatPerson()能夠根據接受的參數來構建一個包含所有必要信息的Person對象。可以無數次地調用這個函數,而每次它都會返回一個包含三個屬性一個方法的對象。
- 工廠模式的缺點:雖然工廠模式解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(也就是怎麼樣知道一個對象的類型)。
- 構造函數模式
JavaScript中的構造函數可以用來創建特定類型的對象。
示例2:
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
};
var person = new Person('tony',11,'student');
按照慣例,構造函數始終都應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭。我們可以看到示例2上,創建一個person實例,必須使用new操作符。
- 構造函數的問題:使用構造函數的主要問題,就是每個方法都要在每個實例上重新創建一遍。
- 原型模式
我們創建的每個函數都有一個Prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的多有實例共享的屬性和方法。
示例3:
function Person(){
}
Person.prototype.name = "tony";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function () {
alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"tony"
var person2 = new Person();
person2.sayName(); //"tony"
alert(person1.sayName == person2.sayName); //true
- 原型模式的缺點:首先,它省略了爲構造函數傳遞初始化參數這一環節,結果所有實例在默認情況下都將取得相同的屬性值。其次,也是原型模式最大的問題是由其共享的本性所導致的。實例一般都是要有屬於自己的全部屬性的。而這個問題正是我們很少單獨使用原型模式的原因所在。