1.原型跟原型鏈
每個物件都有乙個原型物件,物件是以其為模板,從原型繼承方法和屬性。原型物件也有原型,並從中繼承方法跟屬性,一層一層,這種關係就是原型鏈。這些屬性跟方法是定義在object的建構函式的prototype屬性上的,而非物件例項本身。
在傳統的物件導向語言中,是通過定義乙個類,此後建立物件的例項,類中定義的屬性跟方法都複製到例項中,而js中並不是這樣複製的,而是通過在物件例項和他的構造器之間建立乙個鏈結,(它是__proto__屬性,是從建構函式的prototype屬性派生的)通過上溯原型鏈,在構造器中找到這些屬性跟方法的。
__proto__是每個例項都有的屬性,prototype是建構函式的屬性,new出來的例項是沒有prototype屬性的,只有__proto__屬性,a的__proto__屬性就是a的prototype屬性,(a是方法,a是a的乙個例項)。
constructor 屬性返回對建立此物件的陣列函式的引用。在建構函式上,a.proto.constructor可以訪問(返回的是建構函式)
例如:在例項屬性和原型屬性都有乙個名為name的屬性,但是最後會輸出例項的屬性,當我們讀取乙個屬性的時候,如果在屬性例項上能找到就讀取他,不會去管原型上是否有這個屬性,其實就是屬性的遮蔽,這個只會是遮蔽,不會去修改原型上的,原型上的值還在。
function
person()
//原型屬性
person.prototype.name=
'deng'
var person1 =
newperson()
//例項屬性
person1.name =
'd'console.
log(person1.name)
//d
但是如果在例項上沒有找到這個屬性,就會去例項的原型上找,找到就輸出,找不到就繼續去原型的原型上找,直到盡頭,可以用hasownproperty方法去判斷這個屬性到底是原型上還是在例項上,只有在例項上才會顯示true
function
person()
//原型屬性
person.prototype.name=
'deng'
var person1 =
newperson()
//例項屬性
console.
log(person1.name)
//deng
person1.
hasownproperty
('name'
)//false
原型繼承
function
show()
function
run(
)run.prototype=
newshow()
;var show=
newrun()
;console.
log(show.name)
//結果:run
原型鏈繼承
function
supertype()
supertype.prototype.
fun=
function()
;function
subtype()
//繼承了supertype
subtype.prototype =
newsupertype()
;var instance1 =
newsubtype()
;instance1.colors.
push
("黑");
console.
log(instance1.colors)
;//["紅", "藍", "綠", "黑"]
var instance2 =
newsubtype()
;console.
log(instance2.colors)
;//["紅", "藍", "綠", "黑"]
優點:能通過instanceof和isprototypeof的檢測
注意:給原型新增方法的語句一定要放在原型替換subtype.prototype = new supertype();之後
缺點:(1)supertype中的屬性(不是方法)也變成了subtype的prototype中的公用屬性,
如上面例子中的color屬性,可以同時被instance1和instance2修改
(2)建立子型別的時候,不能像父型別的建構函式中傳遞引數。
組合繼承
function
box(age)
box.prototype.
run=
function()
;function
desk
(age)
desk.prototype =
newbox()
;//原型鏈繼承
var desk =
newdesk
(100);
alert
(desk.
run())
;
原型prototype與原型鏈 proto
基於內建類原型擴充套件方法 以一道題為例,剖析原型與原型鏈的底層機制 呼叫當前例項物件的某個屬性 成員訪問 先看是否是自己的私有屬性,如果是則返回私有屬性的值 如果不是則沿著原型鏈 proto 向上查詢所屬類原型中的公有屬性 方法,直到查詢到基類object的原型為止。f1.proto gety 跳...
prototype內部方法跟原型建立方法的一些區別
1 prototype是與clone聯絡起來的,也就是說,當建立例項時,prototype會把成員clone到該class function 的例項上。detail 最常見的幾個內建內物件裡的prototype,如 array原型有join,split方法,當建立陣列a時var a 1,2 原型裡的...
物件導向 prototype 原型鏈 繼承
物件導向 oop,即 object oriented 是相對於面向過程來講的,簡單說就是把資料和方法組合封裝起來成為乙個整體,提高軟體的重用性 靈活性和擴充套件性。物件導向特點 當建立的物件較多時,會有可共用的屬性,此時就可用prototype。比如我們用array來建立乙個例項時,不用我們定義,它...