零說
在JavaScript中,一切皆對象,沒錯,都是對象,它想說的是它們都是存在的。
一說
萬物始於混沌,混沌者,陰陽不知,因果無序,天生規則,化陰陽,立五行,繁於序。
二說
天地初生,JavaScript中有五大對象,相互獨立,不知誰先誰後,但是都秉天地而生,萬物唯一。
五象
所謂字面形式就是你肉眼看見的樣子。
- null對象:字面形式爲,null。
- Object對象:字面形式爲,function Object() { [native code] }。
- Function對象:字面形式爲,function Function() { [native code] }。
- 源對象(Origin):暫且給它起個名字,叫源對象。字面形式爲,Object {}。
- 匿名對象(Anonymous):暫且給它起個名字,叫匿對象。字面形式爲,function(){}。此匿名對象非彼匿名對象(我們自定義方法時不寫方法名)。
起源
他們是哪五個,在JavaScript中的哪裏?
- null對象:正如你在JavaScript中所瞭解的一樣,就是那個null對象。
- Object對象:就是那個你在編輯器裏寫下Object這五個單詞所描述的對象。
- Function對象:和Object對象一樣,就是你認爲的那個Function對象。
- Origin對象:這個對象,也不難找,你找到上面Object對象,在找到它的prototype 屬性就找到了。它就是Object.prototype 所指向的那個對象。
- Anonymous對象:這個對象,很好找,找到上面的Function對象,也是找到它的prototype 屬性就找到了,它就是Function.prototype 所指向的那個對象。
外傳1
上古記載,創造萬物對象時,只創建了五大對象,所有對象都有_proto_ 和constructor屬性,而其中兩個對象還有有 prototype 屬性,這兩個對象便是陰陽化身,他們叫Object對象和Function對象。
又記載,凡有 _proto_ 屬性的對象稱謂爲普通對象,如果還擁有 prototype 屬性就稱謂爲方法對象,但是凡事都有列外,其中有一個對象它是方法對象,但是卻沒有prototype 屬性,它便是Anonymous 對象。
關係
它們生於計算機的內存混沌中,本來是半毛錢關係也沒有的,後來有個神邸創造了一套規則,教化五象,上面那五個對象。之後他們彼此相親相愛,繁榮世間。所以,這些規則+五象,便是維持世間萬物衍變的根基。
以下便是關係:
Object.prototype===Origin //true
Object.__proto__=== Anonymous,//true
Object.constructor===Function//true
Function.prototype=== Anonymous,//true
Function.__proto__ === Anonymous,//true
Function.constructor === Function//true
Anonymous.__proto__=== Origin,//true
Anonymous.constructor===Function//true
Origin.__proto__===null,//true
Origin.constructor===Object//true
關係:沒有道理可言,它存在着,便注視着彼此,羈絆着彼此。
外傳2
函數對象 的__proto__屬性指向的對象是一個方法對象,prototype 屬性指向的是一個普通對象。
普通對象 的__proto__ 屬性指向的對象是一個普通對象。
規則
後世之後,創建的普通方法對象則必須參考Function對象和Object對象或普通對象。
而創建普通對象有兩種方式,一種是參考Object對象或普通方法對象創建普通對象,一種是使用Object的create方法創建普通對象(這個不說)。
ps: 別想着對象創建對象了,創建對象的事情不是對象做的,它只能提供自身的基因與能力,真正創建對象的是JavaScript引擎,參考,即獲取其基因與能力。
普通對象
參考Object方法對象創建普通對象:
規則1: 參考Object方法對象創建普通對象x時,
即 var x = new Object(),創建之後的x對象有,
x.__proto__ = Object.prototype,x.constructor = Object
參考普通方法對象創建普通對象:
規則2: 參考普通方法對象fn創建普通對象x時,
即 var x = new fn(),
創建之後的x對象有,
x.__proto__ = fn.prototype,
x.constructor = fn.prototype.constructor
普通方法對象
創建普通方法對象:
規則3: 創建方法對象fn時,
即var fn = new Function(),
默認其__proto__屬性指向Function對象的屬性prototype指向的對象,
即anonymous對象,
也即fn.__proto__ = Function.prototype = anonymous
規則4: 創建方法對象fn時,
默認其prototype屬性指向一個由Object創建的一個普通對象x,
即fn.prototype=x,
並將這個普通對象x的constructor指向該方法對象fn,
即x.constructor=fn
其實__proto__和prototype以及constructor都是可以人爲修改的,上面規則是js引擎創建對象時的默認規則。之後我們可以對創建的對象屬性直接賦值修改。
外傳3
JavaScript中的對象,可以分爲三大類,特殊對象和方法對象和普通對象,特殊對象即上面五大對象中的null和Origin和Anonymous對象,之後,其餘的對象以prototype屬性有無來區分是否是方法對象。如果不是那就是普通對象,即,所有對象都是普通對象,也叫做對象,超集。方法對象可以分爲普通方法對象和特殊方法對象,特殊方法對象就兩個,Function對象和Object對象,其他都是普通方法對象,普通方法對象,又分內置普通方法對象和自定義方法對象,內置普通方法對象即JavaScript本身提供的方法對象,如Number,String等等,自定義方法對象也就是我們自己定義封裝的對象。
結束
上面關於一些定義都是一家之言,只是爲了便於理解JavaScript中的原型關係。一句話,Fucntion對象予其進化的能力,Object對象予其存在的能力。體現在,_proto_ 屬性使其有能力遺傳先輩的能力,而prototype屬性使其有重構優化先輩的能力和創造自身新能力的能力。