面向對象(2) 原型 原型鏈的理解數組
1.面向對象的目的就是生成對象object。app
2.生成對象的方式函數
(1)單例模式(字面量定義)var obj={}this
(2)類的實例 var obj=new Object()spa
(3)工廠模式prototype
(4)構造函數3d
工廠模式和構造函數的區別?對象
工廠模式,生成的對象必需要返回,構造函數模式不用return,構造函數模式默認return旳是this,在構造函數內的this就是實例對象。blog
構造函數若是人爲return的不是對象,直接忽略,若是人爲return的是對象,就取代this。繼承
工廠模式生成的實例對象的__proto__直接指向基類object的原型;
構造函數生成的實例對象的__proto__指向它父類的原型,而後父類的原型上的__proto__指向基類object的原型。
每一個實例和實例之間都是獨立的個體,它們之間的的屬性互不干擾,是不等的,若是實例和實例之間的屬性相等,則這個屬性必須是父類的原型上的屬性。是由於父類原型上的屬性是可繼承的,共享的。
原型鏈:
在操做obj.屬性的時候,首先看這個屬性是私有的仍是從父類的原型上繼承的,若是是私有的直接使用,若是私有的沒有就查看父類的原型上有沒有,若是有就直接使用,若是沒有 就再次向父類的父類的原型上查找,一直查到基類object爲止,若是object也沒有就獲得undefined,這就是原型鏈。
實例的__proto__上的屬性
instanceof 判斷對象是否是這個類的實例對象;
isPrototypeOf() 判斷實例對象是不是父類的原型
getPrototypeOf() 獲取實例對象的原型;
hasOwnProperty() 判斷一個屬性是否是自身(私有)的屬性
in 判斷1一個山西是否是這個對象上的無論是私有的仍是公有的
實例對象的原型就是他父類的原型
3.若是不給類的原型指定一個對象,這個實例對象的__proto__上有一個constructor屬性;
若是給這個類的原型指定了一個對象,實例上的__proto__就沒有constructor屬性了。
構造函數裏和原型裏的this都指向實例對象
This指向問題:
(1)this是一個對象,函數外的this都指向window;
(2)函數內的this,它的指向跟函數調用有關,看函數得前面有沒有點,有點就指向點前面的對象,沒有就指向window;
(3)定時器的this永遠是window,自執行函數裏的this是window
(4)構造函數裏的this和原型上的this都指向實例對象
改變this指向的方法:
提早將this賦值;
call;
apply call和apply執行是同樣的都是將前面函數內的this改爲第一個參數,而後執行前面的函數,不一樣在從第二個函數開始 apply是一個數組;
bind bind只改變前面函數的this,可是不執行前面的函數,須要加一個()才執行繼承。
繼承
(1)call繼承 子類繼承父類;
將父類的私有屬性繼承爲子類的私有屬性
(2)原型繼承 將父類的私有和公有屬性都繼承爲子類的公有屬性
子類的原型=父類的實例 B。prototype=new A()