一切都是對(duì)象
(undefined, number, string, boolean)屬于簡單的值類型乙埃,不是對(duì)象闸英。剩下的幾種情況——函數(shù)、數(shù)組介袜、對(duì)象甫何、null、new Number(10)都是對(duì)象遇伞。他們都是引用類型辙喂。
javascript ——數(shù)組是對(duì)象,函數(shù)是對(duì)象鸠珠,對(duì)象還是對(duì)象巍耗。對(duì)象里面的一切都是屬性,只有屬性跳芳,沒有方法芍锦≈衩悖——方法也是一種屬性飞盆。因?yàn)樗膶傩员硎緸殒I值對(duì)的形式。
var obj = {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //obj是一個(gè)自定義的對(duì)象次乓,a吓歇、b、c都是它的屬性
? ? a : 10,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //a的屬性值是10
? ? b : function (x) {? ? ? ? ? ? ? ? ? ? //b的屬性值是一個(gè)函數(shù)
? ? ? ? ? ? alert(this.a + x)
? ? ? ? ? }
? ? c : {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //c的屬性值是一個(gè)對(duì)象票腰,它又有name城看、year兩個(gè)屬性
? ? ? ? ? ? name :? 'zev',
? ? ? ? ? ? year : 1993
? ? ? ? ? }
}
函數(shù)與對(duì)象的關(guān)系:對(duì)象是函數(shù)創(chuàng)建的(new)
typeof( function() {...} )? ? ? ? ? ? ? ? ? ? ? ? ---------------function
typeof( object )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---------------object
function () {...} instanceof Object? ? ? ? ---------------true
我們可以說數(shù)組是對(duì)象中的一種,但卻不能說函數(shù)是對(duì)象的一種杏慰,它不是一種包含與被包含的關(guān)系测柠,它們的關(guān)系很復(fù)雜,有點(diǎn)雞生蛋蛋生雞的邏輯缘滥。
有一點(diǎn)是確定的轰胁!——任何對(duì)象都是通過函數(shù)創(chuàng)建的,哪怕是數(shù)組朝扼。雖然從語法上看不出來赃阀,但是數(shù)組的構(gòu)建是被一層語法糖包裹著。
function Fn ( ) { ......}
var obj = new Fn( )
函數(shù)與對(duì)象的關(guān)系:函數(shù)是一種對(duì)象擎颖。
函數(shù)也是屬性的集合榛斯,也可以對(duì)函數(shù)進(jìn)行自定義屬性。
prototype是函數(shù)的默認(rèn)屬性搂捧,是每個(gè)函數(shù)都顯式具備的驮俗,它的屬性值是一個(gè)對(duì)象prototype,而這個(gè)對(duì)象默認(rèn)只有constructor一個(gè)屬性值(可以在里面自定義屬性)允跑,而這個(gè)constructor又恰好指向function函數(shù)本身王凑,用偽代碼表示如下:
var function {
? ? ? ? prototype : {
? ? ? ? ? ? ? ? ? constructor :? function
? ? ? ? }
}
每個(gè)函數(shù)都有一個(gè)prototype提佣,每個(gè)對(duì)象都有一個(gè)__proto__
__proto__稱為隱式原型,這個(gè)屬性引用了創(chuàng)建這個(gè)對(duì)象的函數(shù)的prototype荤崇。即:fn.proto=== Fn.prototype