1.構(gòu)造函數(shù)始終都應(yīng)該以一個大寫字母開頭
2.雖然可以通過對象實(shí)例訪問保存在原型中的值双絮,但卻不能通過對象實(shí)例重寫原型中的值
3.在使用for-in循環(huán)時模狭,返回的是所有能夠通過對象訪問的汤踏、可枚舉的屬性,其中既包括存在于實(shí)例中的屬性怔揩,也包括存在于原型中的屬性
4.在創(chuàng)建自定義類型最常見的方式蔗坯,就是將構(gòu)造函數(shù)模式用于定于實(shí)例屬性,而原型模式用于定義方法和共享的屬性频祝。這種方法最大限度地節(jié)省了內(nèi)存泌参,還支持想構(gòu)造函數(shù)傳遞參數(shù)
5.寄生構(gòu)造函數(shù)模式,構(gòu)造函數(shù)返回的對象與在構(gòu)造函數(shù)外創(chuàng)建的對象沒有什么不同常空,因此沽一,不能依賴instanceof操作符來確定對象類型
6.兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承。接口只繼承方法簽名漓糙,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法铣缠。ECMAScript只支持實(shí)現(xiàn)繼承,主要依靠原型鏈實(shí)現(xiàn)的昆禽。
7.構(gòu)造函數(shù)蝗蛙、原型和實(shí)例的關(guān)系:每個構(gòu)造函數(shù)都有一個原型對象,原型對象都包含一個指向構(gòu)造函數(shù)的指針醉鳖,而實(shí)例都包含一個指向原型對象的內(nèi)部指針
8.給原型添加方法的代碼一定要放在替換原型的語句之后
9.在通過原型鏈實(shí)現(xiàn)繼承時捡硅,不能使用對象字面量創(chuàng)建原型方法,因?yàn)檫@樣會重寫原型鏈
10.借用構(gòu)造函數(shù):在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)
11.組合繼承:將原型鏈和借用構(gòu)造函數(shù)技術(shù)組合到一起盗棵。使用原型鏈實(shí)現(xiàn)對原型屬性和方法的繼承壮韭,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對實(shí)例屬性的繼承北发。其最大的問題就是無論在聲明情況下,都會調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型的時候喷屋,另一次是在子類型構(gòu)造函數(shù)內(nèi)部琳拨。
12.寄生式繼承:創(chuàng)建一個僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強(qiáng)對象屯曹,最后再返回對象
13.寄生組合式繼承:通過借用構(gòu)造函數(shù)來繼承屬性狱庇,通過原型鏈的混成形式來繼承方法。開發(fā)人員普遍認(rèn)為寄生組合式繼承是引用類型最理想的繼承范式
14.在沒有類的情況下恶耽,可以采用下列模式創(chuàng)建對象:
①對象字面量:
var person = {
? ? ? ? name: "Kaitlyn"密任,
? ? ? ? age: 22,
? ? ? ? job: "Front - End Engineer",
? ? ? ? sayName: function(){
? ? ? ? ? ? ? ? alert(this.name);
? ? ? ? }
};
缺點(diǎn):使用同一個接口創(chuàng)建很多對象,會產(chǎn)生大量的重復(fù)代碼驳棱。
②工廠模式:
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("Kaitlyn", 22, "Front - End Engineer");
var person2 = createPerson("Greg", 27, "Doctor");
缺點(diǎn):該模式產(chǎn)生的所有對象的類型都是Object批什。
③構(gòu)造函數(shù)模式:
function Person(name, age, job){
? ? ? ? this. name=name;
? ? ? ? this. age=age;
? ? ? ? this. job=job;
? ? ? ? this. sayName = function(){
? ? ? ? ? ? ? ? alert(this.name);
? ? ? ? }
}
var person1 = new Person("Kaitlyn", 22, "Front - End Engineer");
var person2 = new Person("Greg", 27, "Doctor");
缺點(diǎn):每個方法都要在每個實(shí)例上重新創(chuàng)建一遍
④原型模式:
function Person(){
}
Person.prototype = {
? ? ? ? name: "Kaitlyn",
? ? ? ? age: 22,
? ? ? ? job: "Front - End Engineer",
? ? ? ? friends = ["Greg", "Court"];
? ? ? ? sayName: function(){
? ? ? ? ? ? ? ? alert(this.name);
? ? ? ? }
}
var me = new Person();
缺點(diǎn):所有實(shí)例在默認(rèn)情況下都取得相同的屬性值社搅;對于包含引用類型值的屬性來說驻债,比如數(shù)組,若一個實(shí)例向數(shù)組中添加了一個字符串?dāng)?shù)組形葬,那么另一個實(shí)例的數(shù)組也被修改了合呐。
⑤組合使用構(gòu)造函數(shù)模式和原型模式:
function Person(name, age, job){
? ? ? ? this. name = name;
? ? ? ? this. age = age;
? ? ? ? this. job = job;
? ? ? ? this. friends = ["Greg", "Court"];
}
Person.prototype = {
? ? ? ? constructor: Person,
? ? ? ? sayName: function(){
? ? ? ? ? ? ? ? alert(this.name);
? ? ? ? }
}
var person1 = new Person("Kaitlyn", 22, "Front - End Engineer");
var person2 = new Person("Greg", 27, "Doctor");
⑥動態(tài)原型模式
⑦寄生構(gòu)造函數(shù)模式
⑧穩(wěn)妥構(gòu)造函數(shù)模式
15.繼承模式:
①原型式繼承:
②寄生式繼承:
③組合式繼承:
④寄生組合式繼承: