JavaScript原型

零說

在JavaScript中,一切皆對象,沒錯,都是對象,它想說的是它們都是存在的。

一說

萬物始於混沌,混沌者,陰陽不知,因果無序,天生規則,化陰陽,立五行,繁於序。

二說

天地初生,JavaScript中有五大對象,相互獨立,不知誰先誰後,但是都秉天地而生,萬物唯一。

五象

所謂字面形式就是你肉眼看見的樣子。

  1. null對象:字面形式爲,null。
  2. Object對象:字面形式爲,function Object() { [native code] }。
  3. Function對象:字面形式爲,function Function() { [native code] }。
  4. 源對象(Origin):暫且給它起個名字,叫源對象。字面形式爲,Object {}。
  5. 匿名對象(Anonymous):暫且給它起個名字,叫匿對象。字面形式爲,function(){}。此匿名對象非彼匿名對象(我們自定義方法時不寫方法名)。

起源

他們是哪五個,在JavaScript中的哪裏?

  1. null對象:正如你在JavaScript中所瞭解的一樣,就是那個null對象。
  2. Object對象:就是那個你在編輯器裏寫下Object這五個單詞所描述的對象。
  3. Function對象:和Object對象一樣,就是你認爲的那個Function對象。
  4. Origin對象:這個對象,也不難找,你找到上面Object對象,在找到它的prototype 屬性就找到了。它就是Object.prototype 所指向的那個對象。
  5. 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屬性使其有重構優化先輩的能力和創造自身新能力的能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章