摘要:每個函數(shù)都有一個屬性構造函數(shù)指向實例原型如下圖重點理解實例對象指向實例原型對象參考原博客的那個部分挖來下圖理解之后我們來看在聲明函數(shù)的時候有一種聲明方法是構造函數(shù)下面參考阮一峰第三種聲明函數(shù)的方式是構造函數(shù)。
理解關于Function的原型鏈問題
關于Function的原型鏈問題的一些個人粗略理解,歡迎指正錯誤的地方
可以看這篇文章:https://github.com/KieSun/Blo...
要理解Function的原型鏈的問題
首先深入理解__proto__
__proto__的含義是 實例對象指向實例原型!!
實例的原型對象就是構造函數(shù).prototype
例如
function Person() { } var person = new Person(); console.log(person.__proto__ === Person.prototype); // true
所以:
每一個JavaScript對象(除了 null )都具有的一個屬性,叫__proto__,這個屬性會指向該對象的原型(對象)。
每個函數(shù)都有一個 prototype 屬性,構造函數(shù)指向實例原型,如下圖
重點理解: 實例對象.__proto__指向實例原型對象
參考原博客__proto__的那個部分
挖來下圖
理解之后我們來看 Function
1
在聲明函數(shù)的時候
有一種聲明方法是Function 構造函數(shù)
下面參考阮一峰
第三種聲明函數(shù)的方式是Function構造函數(shù)。
var add = new Function( "x", "y", "return x + y" ); // 等同于 function add(x, y) { return x + y; }
也就是說Function是一個構造函數(shù),用來生成函數(shù)的構造函數(shù).那么,String(),Boolean(),Number()這些函數(shù)都是Function構造出來的,new出來的,也就是說String(),Boolean(),Number()這些函數(shù)(函數(shù)也是廣義對象)是Function的實例對象.那么 實例對象.__proto__指向實例原型對象
也就是說
String.__proto__===Function.prototype//true Number.__proto__===Function.prototype//true Boolean.__proto__===Function.prototype//true Object.__proto__ === Function.prototype//true
不只是上述構造函數(shù),實際上,
任意函數(shù)的__proto__都===Function.prototype
即
所有函數(shù).__proto__===Function.Prototype
因為任意函數(shù)都是Function() new(構造)出來的.
任意函數(shù)都是Function()構造函數(shù)的實例
關于Function 最奇特 的是
Function.__proto__===Function.Prototype//true
因為 所有函數(shù)實例.__proto__就是Function構造函數(shù)的原型(Function.Prototype),函數(shù)而函數(shù)實例也包括他自己.
深入理解:
Function作為一個函數(shù)對象實例,他有__proto__,指向原型
Function又作為一個構造函數(shù),他有自己的protoype,指向原型
所以
而
Function.__proto__===Object.Protoype//false
也就是說
更深層次的理解:
Function優(yōu)先是一個函數(shù)實例
自身是構造函數(shù),自身又是自身構造函數(shù)的實例
其次才是廣義的對象.
2
Function也可以看作是String()或者Boolean()或Number()同等地位
因為所有函數(shù).prototype雖然是實例原型,但是實例原型本質還是一個對象,也就是說所有的實例原型對象是Object()構造函數(shù)的實例,即
String.prototype.__proto__=== Object.prototype//true Number.prototype.__proto__=== Object.prototype//true Boolean.prototype.__proto__=== Object.prototype//true //同理 Function.prototype.__proto__=== Object.prototype//true
Function總結:
如果把函數(shù)看成對象,那么函數(shù).__proto__ === Function.prototype
如果把 Function 看成對象,那么 Function.__proto__ === Function.prototype
最終總結實例對象.__proto__===構造函數(shù).prototype
其中實例對象是構造函數(shù)構造的實例.
原型鏈:
每層的__proto__都指向上一層的原型,所以一層一層的__proto__組成的鏈就成為原型鏈.
最終
Object.prototype.__proto__ //null
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94833.html
這是 最近在學習js繼承時看了多篇文章以及自我總結的學習筆記。 目錄:一:原型鏈二:構造函數(shù)三:原型鏈和構造函數(shù)組合繼承四:原型式五:寄生式六:寄生組合式 1、原型鏈 function Super(){ this.name = lily; this.age = 21; this.arr = [1,2,3] } function Sub(){} Sub.prototype = new S...
摘要:因為這造成了繼承鏈的紊亂,因為的實例是由構造函數(shù)創(chuàng)建的,現(xiàn)在其屬性卻指向了為了避免這一現(xiàn)象,就必須在替換對象之后,為新的對象加上屬性,使其指向原來的構造函數(shù)。這個函數(shù)接收兩個參數(shù)子類型構造函數(shù)和超類型構造函數(shù)。 最近一直在研究js面向對象,原型鏈繼承是一個難點,下面是我對繼承的理解以下文章借鑒自CSDN季詩筱的博客 原型鏈繼承的基本概念: ES中描述了原型鏈的概念,并將原型鏈作為實現(xiàn)...
摘要:前言作為前端高頻面試題之一,相信很多小伙伴都有遇到過這個問題。 前言 作為前端高頻面試題之一,相信很多小伙伴都有遇到過這個問題。那么你是否清楚完整的了解它呢? 國際慣例,讓我們先拋出問題: 什么是原型、原型鏈 它們有什么特點 它們能做什么 怎么確定它們的關系 或許你已經(jīng)有答案,或許你開始有點疑惑,無論是 get 新技能或是簡單的溫習一次,讓我們一起去探究一番吧 如果文章中有出現(xiàn)紕...
摘要:第一種方式是使用操作符,只要檢測的實例對象中的原型鏈包含出現(xiàn)過的構造函數(shù),結果就會返回。而這也正是組合使用原型模式和構造函數(shù)模式的原因。在構造函數(shù)模式中定義屬性,在原型模式中定義共享的方法。 前言:最近在細讀Javascript高級程序設計,對于我而言,中文版,書中很多地方翻譯的差強人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯誤,會非常感謝您的指出。文中絕大部分內(nèi)容引用自《Ja...
摘要:每一個由構造函數(shù)創(chuàng)建的對象都會默認的連接到該神秘對象上。在構造方法中也具有類似的功能,因此也稱其為類實例與對象實例一般是指某一個構造函數(shù)創(chuàng)建出來的對象,我們稱為構造函數(shù)的實例實例就是對象。表示該原型是與什么構造函數(shù)聯(lián)系起來的。 本文您將看到以下內(nèi)容: 傳統(tǒng)構造函數(shù)的問題 一些相關概念 認識原型 構造、原型、實例三角結構圖 對象的原型鏈 函數(shù)的構造函數(shù)Function 一句話說明什么...
閱讀 1446·2021-11-16 11:44
閱讀 3286·2021-09-29 09:43
閱讀 620·2019-08-30 10:52
閱讀 938·2019-08-29 11:01
閱讀 3258·2019-08-26 11:47
閱讀 2885·2019-08-23 12:18
閱讀 1359·2019-08-22 17:04
閱讀 2046·2019-08-21 17:04