函數對象是JavaScript學習中不可避免的一部分,並且這一部分相對重要且抽象 函數的建立方式有2種:函數
var foo = function(){ console.log("test"); }
//let 函數名 = new Function(「參數列表」,」函數體」); let sum = new Function("num1,num2","return num1+num2");
咱們多數在使用new關鍵字的時候,是用於建立實例對象學習
那麼咱們首先來看一下,在使用new關鍵字建立實例對象的時候,都經歷了什麼:this
這個時候咱們的關注點 原型對象 就出現了:prototype
prototype
prototype
是一個顯式原型屬性(也能夠叫它原型對象),只有函數纔有該屬性,一般咱們叫這個時候的函數爲"構造函數"prototype
的伴隨構造函數的聲明就會被自動建立prototype
只有一個屬性:constructor
代碼舉例:code
function Student(name,age){ this.name = name; this.age = age; } let s1 = new Student("Tom",17);
首先咱們建立了一個構造函數Student
,此時Student
的結構中會出現一個prototype
屬性,即原型對象,這是引擎自動給它的,咱們能夠直接進行使用對象
prototype
中的constructor
屬性:此時能夠看出constructor
對應的是構造函數,也就是Student
blog
而且這是一個公有不可枚舉屬性,一旦改變了prototype
,這個屬性就會不見,固然能夠再手動添加回去繼承
而當咱們再使用new關鍵字建立實例對象s1
以後,咱們來看一下s1
的結構:ip
實例對象s1
中除了在Student
得到的age
,name
屬性以外,還有一個__proto__
屬性,因此它又是什麼東西呢?原型鏈
__proto__
是什麼__proto__
是每一個對象都有的隱式原型屬性,指向了建立該對象的構造函數的原型對象prototype
,可是 prototype
是內部私有屬性,咱們並不能訪問到,因此使用__proto__
進行訪問
至於__proto__
是如何產生的,上面的new關鍵字建立函數的時候的第三部"連接到原型,繼承屬性和方法"的時候就讓實例對象,例如s1
擁有了__proto__
屬性
從實例對象s1
的__proto__
指向構造函數Student
的prototype
,構成了原型鏈
經過原型鏈的概念,咱們就不難理解實例對象是如何繼承構造函數中原型對象的屬性和方法了
function Student(name,age){ this.name = name; this.age = age; } Student.prototype.method = function(){ console.log("個人名字是"+this.name+",個人年齡是"+this.age); } let s1 = new Student("Tom",17); s1.method(); //個人名字是Tom,個人年齡是17
任意的一個函數, 都是至關於 Function 的實例. 相似於 {} 與 new Object() 的關係
function foo () {}; // 告訴解釋器, 有一個對象叫 foo, 它是一個函數 // 至關於 new Function() 獲得一個 函數對象
__proto__
屬性Function.prototype
Fucntion.prototype
繼承自 Object.protoype
array instanceof Array
判斷 構造函數 Array 的原型 是否在 實例對象 array 的原型鏈存在