對象創建:
當一個函數對象被創建時候,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)
{
var proto=obj.__proto__;
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.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會無法通過,其他浏覽器上應該都沒有問題