原型跟原型鏈 prototype跟proto

2021-09-30 01:27:42 字數 2654 閱讀 5838

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來建立乙個例項時,不用我們定義,它...