原型物件:只要建立了乙個新函式,就會根據一些特定的規則為該函式建立乙個prototype屬性,這個屬性指向的物件就是該新函式的原型物件。(預設情況下,所有原型物件都會自動獲取乙個constructor屬性,這個屬性是乙個指向prototype屬性所在函式的指標)
原型物件的優點:可以讓所有物件例項共享它所包含的屬性和方法。
例項如下:
function test()
test.prototype.name=「張三」; //例項屬性新增到原型物件中
test.prototype.age=「27」;
var test1= new test(); //初始化例項
alert(test1.name); //zhangsan
alert(test1.age); //27
var test2= new test(); //初始化例項
alert(test2.name); //zhangsan
alert(test2.age); //27
例項和原型物件之間的關係圖
(注釋:當呼叫建構函式建立乙個新例項後,該例項內部將包含乙個指標,指向建構函式的原型物件,ecma-262第五版中管這個指標叫做[[prototype]])
繼承方式:許多物件導向語言都支援兩種繼承方式,介面繼承和實現繼承,介面繼承只繼承方法簽名,而實現繼承則繼承實際的方法。由於函式沒有簽名,在ecmascript中無法實現介面繼承。ecmascript只支援實現繼承,而且其實現繼承主要是依靠原型鏈來實現的
原型鏈:舉例說明吧,以上邊原型物件中舉的例項為例,簡單回顧一下建構函式、原型、和例項的關係,每個建構函式都有乙個原型物件,原型物件都包含乙個指向建構函式的指標,而例項都包含乙個指向原型物件的指標。
假設一下:假如我們讓原型物件等於另乙個型別的例項,結果會怎麼樣呢?顯然,此時的原型物件中包含乙個指向另乙個原型的指標,相應的另乙個原型中也包含著乙個指向另乙個建構函式的指標。假如另乙個原型又是另乙個型別的例項,那麼上述關係依然成立,如此層層遞進,就構成了例項與原型的鏈條關係,就是所謂的原型鏈。
例項如下:
實現原型鏈有一種基本模式,其**如下所示
function websum()
websum.prototype.getsumvalue = function()
function webone()
webone.prototype = new websum(); //建立例項的方式繼承websum
var onechild = new webone();
alert(onechild .getsumvalue); //zhangsan
例項的原型煉圖如下
(注釋:webone繼承了websum,而繼承是通過建立websum例項,並將該例項賦給webone.prototype實現的,實現的本質是重寫原型物件,以上例子中我們沒有使用webone預設提供的原型,而是給它換了乙個新原型,這個新原型就是websum的例項。新原型不僅具有作為乙個websum例項所擁有的全部屬性和方法,而且其內部還有乙個指標,指向了websum的原型。
最終結果是這樣:onechild指向webone的原型,webone的原型又指向websum的原型
最後,例如呼叫onechild .getsumvalue()會經歷三個步驟,1、搜尋例項,2、搜尋webone.prototype,3、搜尋websum.prototype,最後一步才會找到該方法。在找不到屬性或方法的情況下,搜尋過程會一環一環的前行到原型鏈末端才會停下來。)
JS原型物件,原型鏈
js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...
JS 物件 JS原型 原型鏈
參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...
JS物件繼承與原型鏈
在 class based 的物件導向的世界裡,要出現物件,必須先有類。類之間可以繼承,類再使用 new 操作建立出實體,父子物件之間的繼承體現在父類和子類上。你不能說 物件 a 繼承了物件 b,只能說 class a 繼承了 class b,然後他們各自有乙個例項a b。js中實現的是原型繼承。在...