js 創建對象的幾種方式
- 使用 Object 構造函數來創建一個對象,下面代碼創建了一個 person 對象,並用兩種方式打印出了 Name 的屬性值。
var person = new Object();
person.;
person.age=31;
alert(person.name);
alert(person["name"])
2. 使用對象字面量創建一個對象;不要奇怪 person["5"], 這裏是合法的;另外使用這種加括號的方式字段之間是可以有空格的如 person["my age"].
var person =
{
name:"Kevin",
age:31,
5:"Test"
};
alert(person.name);
alert(person["5"]);
3. 使用工廠模式創建對象, 返回帶有屬性和方法的 person 對象。
function createPerson(name, age,job)
{
var o = new Object();
o.name=name;
o.age=31;
o.sayName=function()
{
alert(this.name);
};
return o;
}
createPerson("kevin",31,"se").sayName();
4. 使用自定義構造函數模式創建對象;這裏注意命名規範,作爲構造函數的函數首字母要大寫,以區別其它函數。這種方式有個缺陷是 sayName 這個方法,它的每個實例都是指向不同的函數實例,而不是同一個。
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.sayName=function()
{
alert(this.name);
};
}
var person = new Person("kevin",31,"SE");
person.sayName();
5. 使用原型模式創建對象;解決了方法 4 中提到的缺陷,使不同的對象的函數(如 sayFriends)指向了同一個函數。但它本身也有缺陷,就是實例共享了引用類型 friends,從下面的代碼執行結果可以看到,兩個實例的 friends 的值是一樣的,這可能不是我們所期望的。
function Person()
{
}
Person.prototype = {
constructor : Person,
name:"kevin",
age:31,
job:"SE",
friends:["Jams","Martin"],
sayFriends:function()
{
alert(this.friends);
}
};
var person1 = new Person();
person1.friends.push("Joe");
person1.sayFriends();//Jams,Martin,Joe
var person2 = new Person();
person2.sayFriends();//James,Martin,Joe
6. 組合使用原型模式和構造函數創建對象,解決了方法 5 中提到的缺陷,而且這也是使用最廣泛、認同度最高的創建對象的方法。
function Person(name,age,job)
{
this.name=name;
this.age=age;
this.job=job;
this.friends=["Jams","Martin"];
}
Person.prototype.sayFriends=function()
{
alert(this.friends);
};
var person1 = new Person("kevin",31,"SE");
var person2 = new Person("Tom",30,"SE");
person1.friends.push("Joe");
person1.sayFriends();//Jams,Martin,Joe
person2.sayFriends();//Jams,Martin
7. 動態原型模式;這個模式的好處在於看起來更像傳統的面向對象編程,具有更好的封裝性,因爲在構造函數里完成了對原型創建。這也是一個推薦的創建對象的方法。
function Person(name,age,job)
{
//屬性
this.name=name;
this.age=age;
this.job=job;
this.friends=["Jams","Martin"];
//方法
if(typeof this.sayName !="function")
{
Person.prototype.sayName=function()
{
alert(this.name);
};
Person.prototype.sayFriends=function()
{
alert(this.friends);
};
}
}
var person = new Person("kevin",31,"SE");
person.sayName();
person.sayFriends();
另外還有兩個創建對象的方法,寄生構造函數模式和穩妥構造函數模式。由於這兩個函數不是特別常用,這裏就不給出具體代碼了。
寫了這麼多創建對象的方法,其實真正推薦用的也就是方法 6 和方法 7。當然在真正開發中要根據實際需要進行選擇,也許創建的對象根本不需要方法,也就沒必要一定要選擇它們了。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/RinnDQxWP4F7s5bfdmdihA