建議閱讀本篇之前先了解原型對象和構(gòu)造函數(shù)的概念绊率,你可以看JS鏈知多少炕淮?了解原型柿估,看學(xué)好js,這些js函數(shù)概念一定要知道了解構(gòu)造函數(shù)岸浑。
首先看個例子:
var ary = new Array();
js中構(gòu)造函數(shù)是用來初始化對象的,所以每個對象都會有一個構(gòu)造函數(shù)搏存,上例中ary
的構(gòu)造函數(shù)就是Array
。js中每個對象都會有一個constructor
屬性矢洲,這個屬性的值就是相應(yīng)對象的構(gòu)造函數(shù)璧眠。所以下面的表達(dá)式成立:
ary.constructor === Array // true
由于js中函數(shù)也是對象,所以構(gòu)造函數(shù)Array
也有constructor
屬性读虏,所有的構(gòu)造函數(shù)對象都是系統(tǒng)構(gòu)造函數(shù)Function
初始化來的责静,所以下面的表達(dá)式也成立:
Array.constructor !== Array //true
Array.constructor === Function //true
js中每一個對象都會有一個原型對象與之對應(yīng),并且從原型對象上繼承屬性盖桥。由此可見上例中ary
對象的原型對象來自于構(gòu)造函數(shù)Array
灾螃,在js中可以通過構(gòu)造函數(shù)的prototype
屬性來獲得原型對象的引用,因此ary
對象的原型對象即是Array.prototype
揩徊,也即ary
對象屬性繼承自Array.prototype
對象腰鬼。因為每個對象都繼承自原型對象,所以所有的構(gòu)造函數(shù)(擴(kuò)展開來應(yīng)該是js中所有的函數(shù))都有prototype
屬性塑荒,并且只有函數(shù)對象才有prototype
屬性熄赡;以上,由于ary
對象的原型對象來自于構(gòu)造函數(shù)Array
的prototype
屬性袜炕,所以下面的表達(dá)式也成立:
Array.prototype.constructor === Array //true
由此可以得出的結(jié)論:
- js中函數(shù)對象都有
prototype
,constructor
屬性本谜;普通對象都有constructor
屬性,沒有prototype
屬性偎窘,由JS鏈知多少乌助?這篇文章可知,普通對象用__proto__
屬性表示原型對象; - 下面的表達(dá)式都是成立的:
ary.constructor === Array //true
ary.constructor === Array.prototype.constructor //true
ary.constructor.prototype === Array.prototype //true
Array.prototype.constructor === Array //true
Array.constructor === Function //true
全文完