目錄
prototype和__proto__的屬性聯系和區別
constructor屬性
關系圖
首先我們知道js中函式也是屬于物件的,所以Array、String、Boolean、Function、Object這些系統定義好的函式上也是物件,上面有一些定義好了屬性像__proto__、prototype和constructor等,
prototype和__proto__的屬性聯系和區別
以下說的函式和物件是通過typeof()的結果分開看,且不討論Object.creat(null)的情況,下面只要是===都是可以完全當數學變數互相替換的,文中A指申明的函式,a指通過A構造出來的物件,
1.物件上是沒有prototype的屬性的,只有函式上才有,而__proto__屬性函式和物件上都有,
2.prototype、__proto__的指向都是物件,
3.物件上的繼承即我們通過查找原物件上不存在的屬性時,我們會在該物件的屬性__proto__所指向的物件去尋找,并可以依次類推查找這個物件上的下一個__proto__屬性指向的物件,并把這樣一個鏈接狀態稱為原型鏈,而我們在使用建構式創建物件時會隱式的將__proto__=prototype,這也是為什么每個物件上為什么會有__proto__屬性以及能通過設定建構式的prototype或設定物件的__proto__屬性來繼承物件,(如果是設定prototype,我們需要注意順序,先設定建構式再利用建構式創建物件,如果是設定__proto__屬性,那就可以直接在物件上設定,設定的內容會在添加在原有的__proto__屬性上添加,不會替換,)
4.Array/String/Boolean/Object/Function.prototype各自上都有一些定義好了的方法,屬性,我們在新建物件時,會隱式的呼叫__proto__=prototype,所以能從相對應的函式中繼承系統中不同的的方法和屬性,注意這些prototype屬性是各不相同的,例如var a=String(‘a’),我們能直接使用a.length查看字串物件的長度,這個length屬性就是在String.prototype上定義好的,使用時能在a.__proto__指向的物件上找到該方法,然后這里我們有一條計算機定義好了的,Array/String/Boolean/Function.prototype.__proto__===Object.prototype(可以理解為大家都是物件,所以都繼承制Object.prototype)
5.我們在系統中還有已經定義好的__proto__屬性,Array/String/Boolean/Object/Function.__proto__===Function.prototype;Object.prototype.__proto__===null(所以稱Object.prototype為原型鏈的終端),
6.我們申明的函式的__proto__屬性===Function.__proto__(比如function A(){};A.__proto__===Function.__proto__),而prototype屬性指向一個物件,這個物件只等于本身,可以修改的,但他的__proto__屬性===Object.prototype(即A.prototype.__proto__===Object.prototype),注意A.prototype!==Function.prototype(可以說prototype屬性指向的物件除了Function.prototype和Object.prototype其他的都是除了自己誰都不等于)
以上可以總結為3點:
A.所有函式的__proto__屬性等于Function.prototype,(包括Function本身和申明的函式,相當于都繼承至Function.prototype,即A/Array/String/Boolean/Object/Function.__proto__===Function.prototype),
B.Function.prototype.__proto__===Object.prototype,(Object.prototype為原型鏈的終端,可以得出一個有意思的結論Object.__proto__.__proto__===Object.prototype,像A/Array/String/Boolean/Function都是不等于的,如果只替換左邊的Object是等于的)
C.建構式創建物件時會隱式的將__proto__=prototype,(即a.__proto__=A.prototype)
舉例:
function A(){};
var a = new A();
通過這2句代碼,我們就可以得到以下資訊:首先通過A我們可以得到:
1.A/Array/String/Boolean/Object.__proto__===Function.__proto__;
(A/Array/String/Boolean.prototype不等于誰咱不考慮,然后注意物件上是沒有prototype屬性的,)
然后我們根據A+B的條件能推出
2.A.prototype.__proto__===Object.prototype===Array/String/Boolean/Object/Function.__proto__.__proto__
最后在加上C點a.__proto__===A.prototype,那么我們又可以推出
3.a.__proto__.__proto__===Object.prototype===Array/String/Boolean/Object/Function.__proto__.__proto__
這樣關于__proto__和prototype屬性咱就講完了,這些大家可以通過代碼去驗證,都是個人的理解,有什么問題或題目歡迎討論,
———————————————————————————————————————————————
constructor屬性
然后再講講constructor屬性,這個比較好理解,他和其他屬性的關聯不大,咱單獨講,他就是字面意義,誰構造了他,比如Array/String/Boolean/Object/Function這些都是函式,那么他的構造者就是Function,而物件咱看他是由誰構造的,
總結:
函式的constructor屬性指向
1.所有函式的constructor屬性都指向Function(包括他本身和申明的函式,即A/Array/String/Boolean/Object/Function.constructor===Function),
2.所有函式的prototype指向的物件的constructor屬性都指向本身(A/Array/String/Boolean/Object/Function.prototype.constructor===A/Array/String/Boolean/Object/Function)
然后咱再來看物件的constructor屬性指向
3.誰構造的物件的函式指向誰,比如通過new Number(‘1’)構造的物件,那么他的constructor便指向Number函式,再比如new String(‘a’),那么他的constructor便指向String,(直接通過字面量即={}的創建物件的方式,那么他的constructor指向Object)
至于__proto__指向物件的constructor,我們可以通過上文中的__proto__和prototype的聯系轉化成prototype來求他的constructor,比如申明函式A.__proto__.constructor,通過上面第A條A.__proto__===Function.prototype,那么A.__proto__.constructor===Function.prototype.constructor===Function,這些咱都可以完全像數學變數一樣代換的,咱還可以推一些好玩的,大家可以自己去驗證,比如:
物件a.__proto__===A.prototype,a.__proto__.__proto__===Object.prototype,那么a.__proto__.__proto__.constructor===Object,
然后Array.__proto__===Function.__proto__===Function.prototype,那么Array.__proto__.constructor===Function,
再然后Array.__proto__.__proto__===Object.prototype,那么Array.__proto__.__proto__.constructor===Object,又可以推出Array.__proto__.__proto__.constructor===a.__proto__.__proto__.constructor同理咱還可以得出A/Array/String/Boolean/Object/Function.__proto__.__proto__.constructor===a.__proto__.__proto__.constructor===Object,
這樣關于constructor屬性咱就講完了,這些大家可以通過代碼去驗證,都是個人的理解,有什么問題或題目歡迎討論,
———————————————————————————————————————————————
關系圖
最后我們這里還有一張借用的別人的關系圖來方便大家理解:
———————————————————————————————————————————————————————————————————————————————————————————
以上都是個人的理解總結,不喜勿噴,有什么問題或題目歡迎討論,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261058.html
標籤:其他
上一篇:作業系統的作用及類別
