ECMAScript學習筆記(六)——物件的建立
面向物件程式設計
JavaScript高階程式設計的第六章。
建立ECMAScript物件的一百種方法。
建立物件的一百種方法。
除了之前記錄過的直接new一個Object然後新增物件的方法,還有物件字面量的方法。ECMAScript還有一百種方法建立一個物件。嗯。
使用Object建構函式和物件字面量的方法建立物件,會產生很多重複程式碼嗯,並且無法知道物件的型別。
工廠模式
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("Nicholas", 29, "Software Engineer"); var person2 = createPerson("Greg", 27, "Doctor");
工廠模式能夠解決Object建構函式和物件字面量會產生的大量重複程式碼的問題,但是卻無法解決物件識別的問題。我們無法知道一個物件的型別。
建構函式模式
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function() { alert(this.name); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor");
Person()中的程式碼,沒有顯式的建立物件,直接將屬性和方法賦給了this物件,也沒有return語句。
按照慣例,建構函式始終都應該以一個大寫字母開頭。
要建立Person的例項,就需要使用new操作符。以這種方式呼叫建構函式會經歷四個步驟:
(1) 建立一個新物件
(2) 將建構函式的作用域賦給新物件.this指向了這個新物件
(3) 執行建構函式中的程式碼
(4) 返回新物件
person1和person2分別儲存著Person的一個不同的例項。這兩個物件都有一個constructor屬性,這個屬性指向Person。
person1.contructor == Person; person1 instanceof object; person1 instanceof Person;
建立自定義的建構函式,意味著將來可以將它的例項標識為一種特定的型別。
對於這種構建方法,有以下幾個特點。
1.將建構函式當做函式
建構函式和普通的函式是一樣的。只不過用new操作符來呼叫的時候,就會變成一個構造函數了。
2.建構函式的問題
建構函式,會使型別的每個方法都要在每個例項上重新建立一遍。(如上述示例中的sayName方法)
所以,每個例項所擁有的方法,是不同的例項。
於是,可以這樣建立一個物件:
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName() { alert(this.name); }
但是這樣子,就在全域性作用域中建立了一個,只有Person物件才能呼叫的方法。
十分噁心。於是,這些問題是可以通過原型模式處理掉的嗯。