| 文章簡介:建立自訂類型的常見方式,就是組合使用建構函式模式與原型模式。建構函式模式用於定義執行個體屬性,而原型模式用於定義方法和共用的屬性。結果,每個執行個體都會有自己的一份執行個體屬性的副本。但同時又共用著對方法的引用,最大限度的節省了記憶體。另外這種模式還支援向構造函 |
建立自訂類型的常見方式,就是組合使用建構函式模式與原型模式。建構函式模式用於定義執行個體屬性,而原型模式用於定義方法和共用的屬性。結果,每個執行個體都會有自己的一份執行個體屬性的副本。但同時又共用著對方法的引用,最大限度的節省了記憶體。另外這種模式還支援向建構函式傳遞參數;可謂是集兩種模式之長。下面的代碼重寫了前面的例子:
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.friends = ["Shelby", "Court"];}Person.prototype = { constructor: Person, sayName: function () { alert(this.name); }}var person1 = new Person("Nicholas", 29, "Software Engineer");var person2 = new Person("Greg", 29, "Doctor");person1.friends.push("Van");alert(person1.friends); //"Shelby,Count,Van"alert(person2.friends); //"Shelby,Count"alert(person1.friends === person2.friends); //falsealert(person1.sayName === person2.sayName); //true
在這個例子中,執行個體屬性都是在建構函式中定義的,而由所有執行個體共用的屬性constructor和方法sayName()則是在原型中定義的。而修改了person1.friends(),並不會影響到person2.friends,因為它們分別引用了不同的數組。
這種建構函式與原型混成的模式,是目前在ECMAScript中使用最廣泛、認同度最高的一種建立自訂類型的方法。可以說,這是用來定義參考型別的一種預設模式。