標籤:
——>建立對象
1:原廠模式:將建立對象的過程用函數進行封裝,之後對函數進行調用便可以建立執行個體對象
function createPerson(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 = createPerson("waiting_h","20","student");var person2 = createPerson("william","29","star");View Code
2:建構函式模式:與上述原廠模式的不同之處在於——沒有顯式的建立對象;直接將屬性和方法賦給了this對象;沒有return語句;建立執行個體對象時需要使用new操作符。
function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); };}var person1 = new Person("waiting_h","20","student");var person2 = new Person("william","29","star");View Code
當然,為了避免建構函式內部的函數在每次執行個體化時都要建立(畢竟函數也是對象),可以將內建函式拿出來定義,在內部用賦值的方法進行引用,這樣一來,多個執行個體對象中的該屬性都指向同一個函數。而不是像之前每次都要建立時,每個執行個體對象中該屬性都有一個函數副本。
此時,對於建構函式模式,我們應該來關注一下new操作符:
——new操作符:使用new操作符會經曆如下步驟:
——建立一個新對象;
——將建構函式的範圍賦給新對象(即this指向該新對象);
——執行建構函式中的代碼(為新對象添加屬性);
——返回新對象。
3:原型模式:
funtion Person() {}Person.prototype.name = "waiting_h";Person.prototype.age = 20;Person.prototype.job = "student";Person.prototype.sayName = function() { alert(this.name);};var person1 = new Person();View Code
———原型對象:包含可以由特定類型的所有執行個體共用的屬性和方法。
我們在建立一個函數時,與此同時會自動產生該函數的一個prototype屬性,該屬性指向原型對象,可通過建構函式的該屬性來添加原型對象的屬性,而原型對象在被建立的同時也自動產生一個constructor屬性,該屬性指向原prototype屬性所在的函數。
另外,在我們調用建構函式建立執行個體對象時,該執行個體對象內部包含一個屬性[[Prototype]](ECMAScript 5)用來指向建構函式的原型對象。
so:執行個體對象和建構函式之間沒直接關係。
當然,原型屬性有一個很大的弊端——由原型模式建立的執行個體屬性擁有相同的屬性方法,對於此弊端,我們可以利用執行個體屬性來添加自己獨特的屬性,即使和原型對象中的屬性重名,它也會屏蔽原型對象中的屬性,因為尋找某個執行個體屬性時,是從執行個體本身開始,若沒找到才會去原型對象中尋找。
一般在使用時我們會比較青睞於建構函式模式和原型模式結合使用:建構函式模式用於定義執行個體屬性,原型模式用於定義方法和共用的屬性。
function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.friends = ["BigLun","William"];}Person.prototype = { constructor : Person; sayName : function() { alert(this.name); }}var person1 = new Person("waiting_h",20,"student");View Code
對象2——《javascript進階程式設計》讀書筆記