js 原型 原型鏈,first chasing

2022-09-10 15:21:34 字數 1843 閱讀 2798

原本標題叫"如何快速的理解protoype/proto-chain",寫了不少篇幅

始終覺得過於籠統,且不利於自己深入理解

為了食髓知味

拆分成幾個篇章來研究,但求短小精悍

本篇主講概念

起跑:

prototype 原型:

乙個函式物件才有prototype屬性,普通物件是沒有的(不具備生育能力)

在函式物件被建立時,prototype同時被建立

之後這個函式物件new出來的所有物件,都會繼承了prototype裡的變數與方法

__proto__  原型鏈引用(指標)

需要值得注意的是

a.乙個普通物件的__proto__指向的是它的建構函式的prototype

b.乙個函式物件的prototype的__proto__預設是object{},即:由function object()的原型

c.object.prototype._proto_===null

一言蔽之,__proto__一定指向另一物件的prototype或者null

萬物生於null 

乙個常見的原型鏈,即是從乙個普通物件—>建構函式原型—>object函式原型—>null

加速:

讓我們加點料

var people = function(name)

p1.constructor.prototype.__proto__;//object {}

p1.constructor.__proto__;//function empty()

注意到這裡的empty();

對於任何fnobj,fnobject.prototype.__proto__  與fnobject.__proto__ 是不一樣的

任何fnobject.__proto__==function.prototype

function.prototype //function empty()

學到這裡我們不停在js中印證著:萬物皆物件

函式物件,也依然是物件

掙扎:

可是問題又來了

function.constructor //function function() 

function.__proto__ //function empty()

function.__proto__===function.prototype;//true 這個十分有趣

function.__proto__.prototype===function.prototype.__proto__;//false 這個理所應當,因為普通物件不存在在prototype

function物件,即使找幾次constructor都是function funcition()

這有些無性繁殖或者自交的味道

讓人想起被縛的普羅公尺修斯,活在輪迴之中

通往上層的引用在於function的__proto__和prototype

而無論它的的原型還是還是原型指標都指向function empty()

追尋本質:

function.prototype.constructor //function function() 死胡同...

function.__proto__ //function empty()

function.__proto__.__proto__ // object{} 

function.__proto__.__proto__ .__proto__ //null

到了這裡,一切親切又自然

又回到object{}->null的懷抱

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...

js 原型與原型鏈

5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...

JS原型物件,原型鏈

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...