function Foo(name)
{
this.name=name;
}
let f1=new Person('小明'); //經過new操做符構造一個Person實例
console.log(f1.name) // 小明複製代碼
雖然是簡簡單單的兩行代碼,然而它們背後的關係倒是錯綜複雜的,以下圖所示:bash
看到上面的圖片,確定有人看不下去了,說實話,我剛開始看到這張圖片,我也不想看了,不過今天我會跟你們講清楚函數
1.這裏面有幾個重要屬性,你們必定得明白,prototype,_proto_,constructor,js裏萬物皆對象,其中,prototype(原型屬性)是函數所獨有的,_proto_和constructor屬性是對象所獨有的,因 爲函數也是對象,因此函數擁有以上三種屬性。ui
一:prototype(原型屬性)this
這個屬性是函數獨有的,它是函數內部的一個指針,它指向一個原型對象 即 Person.prototype,這是構造函數的原型對象,它是從函數指向對象它的spa
二:_proto_(這是一個隱藏的屬性)prototype
由上圖你們能夠看到: f1._proto_===Foo.prototype Foo()._proto_===Function.prototype指針
它是從對象指向對象,它指向父級的原型對象,在建立實例對象時,實例在調用屬性或者方法時會先去構造函數內部尋 找,若是沒找到,實例對象就會去_proto_屬性所指向的父級原型對象上尋 找,f1._proto_===Foo.prototype若是仍是沒有則繼續往上找(這就是一條原型鏈) 即Foo.prototype._proto_===Object.prototype,若是仍是沒有就繼續往上,Object.prototype._proto_===null,直到尋找到原型鏈的頂端nullcode
三:constructor(構造函數屬性)cdn
這是一個構造函數屬性,它指向一個函數:f1.constructor===Foo.prototype.constructor===Foo()對象
Foo().constructor===Function();
__proto__
和constructor
屬性是
prototype
屬性是
__proto__
和constructor
屬性。__proto__
屬性的
__proto__
屬性所指向的那個對象(父對象)裏找,一直找,直到__proto__
屬性的終點
undefined
,經過__proto__
屬性將對象鏈接起來的這條鏈路即
prototype
屬性的
f1.__proto__ === Foo.prototype
。constructor
屬性的含義就是
初學者可能會在何謂指向上困惑,所謂指向不過就是一個代稱或者叫別名也好,好比一我的