1. 程式人生 > >JS--創建對象

JS--創建對象

共享 它的 組合 art 導致 構造 new ros func

創建對象的幾種方式

(1)對象字面量

1 var person = {
2     name: "tom",
3     age: 20,
4     sayName: function () {
5         console.log(this.name);
6     }
7 }

(2)Object構造函數

1 var person = new Object ();
2 person.name = "tom";
3 person.age = 20;
4 person.sayName = function () {
5     console.log(this.name);
6
}

描述: Object構造函數和對象字面量常用於創建單個對象,其中對象字面量更為常用(V

缺點:當創建多個相似對象時,會產生大量重復的代碼 (V

(3)工廠模式

1 var createPerson (name, age) {
2     var o = new Object ();
3     o.name = "tom";
4     o.age = 20;
5     o.sayName = function () {
6          console.log(this.name);
7     }
8     return o;
9 }

描述:工廠模式雖然解決了創建多個相似對象的問題,但是沒有解決對象識別的問題(V


缺點:沒有解決對象識別問題,即無法知道一個對象的類型 (V

(4)構造函數模式

1 function Person (name, age) {
2     this.name = name;
3     this.age = age;
4     this.sayName = function () {
5         console.log(this.name);
6     }
7 }    

描述:通過自定義構造函數創建對象意味著它的實例對象是一種特定的類型,這正是構造函數模式勝過工廠模式的地方;(V

   創建對象的同時通過向構造函數傳遞參數初始化對象參數。(V

缺點:若構造函數中有方法的屬性,那麽每創建一個實例這個方法就有創建一遍,創建多個完成相同功能的函數是沒有必要的;(V

   有this對象,無需在執行代碼前就把函數綁定到特定對象上;(V

   若把函數定義到函數外部,那麽全局作用域中的函數只能供特定的對象調用,若定義多個全局函數,這個自定義類型就毫無封裝性可言。(V

(5)原型模式

1 function Person () {}
2 
3 Person.prototype.name = "tom";
4 Person.prototype.age = 20;
5 Person.friends = ["lily", "marton"];
6 Person.prototype.sayName = function () { 7 console.log(this.name); 8 }
9
10 var person1 = new Person ("tom", 20);
11 var person2 = new Person ("zhangsan", 20)
12
13 person1.friends.push("helen");
14 console.log(person1.friends); //"lily", "marton", "helen"
15 console.log(person2.friends); //"lily", "marton", "helen"
16 console.log(person1.friends === person2.friends); //true


描述:實例對象一般都要有屬於自己的全部屬性,這導致了我們並不會單獨使用原型模式。

缺點:省略了為構造函數傳遞初始化參數這一步驟;所有的實例對象在默認情況下取得相同的屬性值;(V

   當通過實例對象修改原型中的屬性值時,所有實例的原型中的屬性都會改變,當這個屬性值為引用類型時,會特別糟糕。(V

(6)構造函數與原型組合模式

 1 function Person (name, age) {
 2     this.name = name;
 3     this.age = age;
 4     this.friends = ["lily", "marton"];
 5 }
 6 Person.prototype = {
 7     constructor: Person,
 8     sayName: function () {
 9        console.log(this.name);
10     }  
11 }
12
13 var person1 = new Person ("tom", 20);
14 var person2 = new Person ("tom", 20)
15
16 person1.friends.push("helen");
17 console.log(person1.friends); //"lily", "marton", "helen"
18 console.log(person2.friends); //"lily", "marton"
19 console.log(person1.sayName === person.sayName); //true


描述:通過構造函數模式定義實例對象的屬性,通過原型模式定義實例對象的共享屬性。(這是目前創建對象使用最廣泛的一種方法)(V

優點:每個實例對象都會有自己的一份實例屬性的副本又同時共享著對方法的引用,最大限度的節省了內存。(V

JS--創建對象