構造函數模式解決了實例識別問題(實例和實例間是相互獨立的
基于構造函數模式的原型模式解決了方法或屬性公有的問題:把實例之間相同的屬性和方法提取成公有的屬性和方法(想讓誰公有就把它放在“類 . prototype”上即可)
基礎知識:
1、每一個函數數據類型(普通函數、類)都有一個天生自帶的屬性:prototype(原型),并且這個屬性是一個對象數據類型的值
2、并在prototype上,瀏覽器天生給它加了一個屬性constructor(構造函數),屬性值是當前函數(類)本身
3、每一個對象數據類型(普通對象、實例、prototype......)也天生自帶一個屬性: __proto __,屬性值是當前實例所屬類的原型(prototype)
eg:
function Fn(){
this.x=100;
this.sum=function(){
};
}
Fn.prototype.getX=function(){
console.log(this.x);
};
Fn.prototype.sum=function(){
};
var f1=new Fn;
var f2=new Fn;
console.log(Fn.prototype.constructor===Fn); //--->true
Object是JS中所有對象數據類型的基類(最頂層的類):
(1).f1 instanceof Object---->true 因為f1通過 __proto __可以向上級查找,不管有多少級,最后總能找到Object
(2).在Object.prototype上沒有 __proto __這個屬性
原型鏈模式:
f1.hasOwnProperty("x“);//--->hasOwnProperty是f1的一個屬性
若f1的私有屬性上沒有這個方法,應如何處理:
(1).通過 對象名 . 屬性名 的方式獲取屬性值的時候,首先在對象的私有的屬性上進行查找,若私有中存在這個屬性,則獲取的是私有屬性值;
(2).若私有的沒有,則通過 __proto __找到所屬類的原型(類的原型上定義的屬性和方法都是當前實例公有的屬性和方法),原型上存在的話,獲取的是公有的屬性值;
(3).若原型上也沒有,則繼續通過原型上的 __proto __繼續向上查找,一直找到Object.prototype為止。。。
這種查找的機制成為”原型鏈模式“
判斷練習:
1、f1.getX===f2.getX //----->true;
2、f1. __proto__.getX===f2.getX //----->true;
3、f1.getX===Fn.prototype.getX //----->true;
4、f1.sum===f2. __proto__.sum //--->false;
5、f1.sum===Fn.prototype.sum //----->false;
注:(自我小總結)
1、函數或類帶prototype的代表公有
2、對象數據類型(實例)帶 __proto __的代表公有
3、在IE瀏覽器中,原型模式也如此,但IE瀏覽器禁止使用 __proto __(怕通過 __proto __把公有修改)可以用Fn.prototype.sum=function(){}
修改公有的sum。(其他可以直接f1. __proto__.sum=function(){}
修改所屬類原型上的sum)
4、鏈式寫法:執行完成某一個方法,不僅得到了想要的結果,而且返回值還需要是當前這個類的實例,只有這樣才能一直鏈下去。eg:
ary.sort(function(a,b){
return a-b;
}).reverse().slice(0,5).pop().push();
//.push is not a function;因為pop執行完成的返回結果是刪除的那個元素,而不是數組了(不是Array的實例了)