標籤:返回 推薦 不同 原型 傳統 缺陷 tle 執行 type
1. 使用Object建構函式來建立一個對象,下面代碼建立了一個person對象,並用兩種方式列印出了Name的屬性值。
var person = new Object(); person.name="kevin"; 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();
另外還有兩個建立對象的方法,寄生建構函式模式和穩妥建構函式模式。由於這兩個函數不是特別常用,這裡就不給出具體代碼了。
js建立對象的方法