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属性使其有重构优化先辈的能力和创造自身新能力的能力。

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