物件建立:
當一個函式物件被建立時候,Function建構器產生的函式物件會執行類似這樣的程式碼:
this.prototype={constructor:this};
假設函式F
F用new方式建構物件時,物件的constructor被設定成這個F.prototype.constructor
如果函數在建立物件前修改了函數的prototype,會影響建立出來物件的construtor屬性
如:
function F(){};
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)
{
function Myinstanceof(obj,type)
{ ; while(proto)
{
if(proto ===type.prototype)break;
proto=proto.__proto__
} {}
function TreeView( ){}
TreeView.prototype=new View();//TreeView.prototype.__proto__=TreeView.prototype 自動完成
var view=newtotype.constructor=TreeView;//修正constructor
var view=new TreeView();// TreeViewView();// 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會無法通過,其他瀏覽器上應該都沒有問題