物件建立:
當一個函數物件被建立時候,Function建構器產生的函式物件會執行類似這樣的程式碼:
this.prototype={constructor:this};
假設函數; 假設函數;
FF用new方式建構物件時,物件的constructor被設定成這個F.prototype.constructor
如果函式在建立物件前就修改了函式的prototype,會影響建立出來物件的construtor屬性如: 複製程式碼
程式碼如下:
function F(){};
function F(){};
.prototype={constructor:'1111'};
var o=new F();//o.constructor==='1111' true
繼承原理
繼承原理:JavaScript中的繼承是使用原型鏈的機制,每個函數的實例都共享構造函數prototype屬性中定義的數據,要使一個類別繼承另一個,需要把父函數實例賦值到子函數的prototype屬性。且在每次new實例物件時,物件的私有屬性__proto__會被自動連接到建構函數的prototype。 instanceof就是尋找實例物件的私有prototype屬性鏈來決定是否為指定物件的實例
具體實例
:
複製程式碼
程式碼如下:
//instanceof實作
function Myinstanceof(obj,type)
{
var proto=obj.__proto=obj.__proto=obj.__ 🎜>while(proto)
{
if(proto ===type.prototype)break;
proto=proto.__proto__;
}
return proto!=null;
}
function View(){}
function TreeView(){}
TreeView.prototype=new View();//TreeView.prototype.__proto__=TreeView.prototype 自動完成TreeView.prototypeTreeView.prototype .constructor=TreeView;//修正constructor var view=new TreeView();//view.__proto__=TreeView.prototype 自動完成alert(view instanceof View); //true 查找到view.__proto__. __proto__時找到alert(view instanceof TreeView); //true 查找到view.__proto__時找到alert(Myinstanceof(view,View)); //true alert(Myinstanceof(view, TreeView)); //true 上面自訂的Myinstanceof就是自己實作的一個instanceof功能的函數,由於IE核心實例儲存prototype不是__proto__,所以Myinstanceof會無法通過,其他瀏覽器上應該都沒問題