原型與原型鏈深度學習

2021-10-13 10:08:12 字數 3771 閱讀 1057

1.函式物件的 prototype 屬性

我們建立的每乙個函式都有乙個 prototype 屬性,這個屬性是乙個指標,指向乙個物件。該函式例項化的所有物件的__proto__的屬性指向這個物件,它是該函式所有例項化物件的原型。

//建構函式

2.constructor屬性

當函式建立,prototype 屬性指向乙個原型物件時,在預設情況下,這個原型物件將會獲得乙個 constructor 屬性,這個屬性是乙個指標,指向 prototype 所在的函式物件。

consloe.

log(person.prototype.constructor)

;//指向person函式

3.__proto__屬性([[prototype]])

在呼叫建構函式時會建立新的例項,例項的內部將包含乙個指標,指向建構函式的原型物件。

var student =

newperson()

;//例項

console.

log(

.__proto__ === person.prototype)

;// true

例項與建構函式的原型物件之間回有一種連線,例項的物件沒有prototype屬性

4.總結

我們可以知道每乙個建構函式都會有乙個prototype屬性(js引擎自動幫我們加上的),這個屬性會指向乙個原型物件(person.prototype),這個建構函式通過new 會生成乙個新的例項物件,這個例項擁有乙個proto屬性,而這個屬性也會指向 原型物件。

通常情況下(沒有手動給person.prototye重新賦值)建構函式的prototype和例項的__proto__指向同一位址。而原型物件會有constructor屬性指向這個建構函式。同樣原型物件也是乙個物件,這個物件也會有他的__proto__屬性,這個屬性又會指向另乙個原型物件,這樣一層層鏈結下去就構成了我們通常所說的原型鏈。

5.instanceof

判斷某個物件是不是某個建構函式的例項,乙個物件的proto屬性和某個建構函式的prototype屬性指向同一位址instanceof就會返回true。

其中檢索的是整條原型鏈上是否出現過,所以因為 ** student.proto.proto=== object.prototype; **使用instance就會返回true

console.

log(student instanceof

person);

//true

console.

log(student instanceof

object);

//true

6.isprototypeof

用於測試乙個物件是否存在於另乙個物件的原型鏈上。

//建構函式

function

person()

functiona(

)//例項

var student =

newperson()

;var a =

newa()

;//驗證

console.

log(person.prototype.

isprototypeof

(student));

//true

console.

log(

a.prototype.

isprototypeof

(student));

//false

7.object.getprototypeof()

es5新增的,這個方法可以返回[[prototype]]的值,也就是proto。在es5中獲取物件的原型鏈標準方法是object.getprototypeof,非標準方式是student.proto大多數現代瀏覽器都會支援)

function

person()

var student =

newperson()

; === person.prototype); // true

console.

log(object.

getprototypeof

(student)

=== person.prototype)

;//true

8.原型鏈詳解

f2和f1是foo建構函式的兩個例項,他們的__proto__屬性指向foo.prototype所指向的位址(換句話說在這裡f2.__proto__和foo.prototype同乙個東西)。

而foo.prototype也是乙個物件,也擁有__proto__屬性,這個屬性和object.prototype指向同乙個位址。

而object.prototype.porto指向null(也就是說並不是每個物件都有__proto__這個屬性)因為這已經是原型鏈的頂端了。

我們再看建構函式foo其實也是乙個物件(函式也是乙個物件)它也擁有__proto__,它的__proto__屬性指向function.prototype所指向的位址(即foo.proto=== function.prototype),這是因為函式物件都是由function這個建構函式構造的。

而function.prototype(或者foo.proto.proto)指向object.prototype。這裡還有中間的object這個特殊的建構函式,他是乙個函式那麼他擁有prototype屬性,同時他又是乙個函式物件,那麼他就是由function構造出來,所以object.proto=== function.prototype,function建構函式也如此

function instanceof

object

// true

object instanceof

function

// true

function instanceof

function

//true

object instanceof

object

// true

參考:你不知道的j

原型與原型鏈

原型有兩種 1為顯示原型,2為隱式原型 1.顯示原型 a prototype b 每個函式都有乙個顯示原型prototype當然函式也有隱式原型 c 原型就是函式的乙個屬性,這個屬性名叫做prototype d 這個屬性即prototype的型別是object 2.隱式原型 a proto b 每個...

原型與原型鏈

圖中一共標了7條線,就一條一條的講,講完了就應該懂了 已知 1.函式是物件,原型也是物件 2.proto 每乙個物件都有,prototype是函式特有的 3.物件的 proto 屬性指向該物件建構函式的 原型 prototype 線1.物件f1的 proto 屬性指向其建構函式的原型 其建構函式 f...

原型與原型鏈

值型別 string,number,boolean,undefined function person var p1 newperson p1即為建構函式person 的例項化物件 var arr 10 20,30 40,50 60 這種語法糖形式的物件建立,是由array 函式建立簡化而來的。這個...