? ? ? ?我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性淑履,這個(gè)屬性是一個(gè)指針米苹,指向一個(gè)對(duì)象公般,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法臼疫。如果按照字面意思來理解择份,那么prototype就是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法烫堤。換句話說荣赶,不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息,而是可以將這些信息直接添加到原型對(duì)象中鸽斟,如下面的例子所示拔创。
例子:
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
person1.sayName();? //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName);? //true
在此,我們將sayName()方法和所有屬性直接添加到了Person的prototype屬性中富蓄,構(gòu)造函數(shù)變成了空函數(shù)伏蚊。即使如此,也仍然可以通過調(diào)用構(gòu)造函數(shù)來創(chuàng)建新對(duì)象格粪,而且新對(duì)象還會(huì)具有相同的屬性和方法躏吊。但與構(gòu)造函數(shù)模式不同的是氛改,新對(duì)象的這些屬性和方法是由所有實(shí)例共享的。換句話說比伏,person1和person2訪問的都是同一組屬性和同一個(gè)sayName()函數(shù)胜卤。要理解原型模式的工作原理,必須先理解ECMAScript中原型對(duì)象的性質(zhì)赁项。