JS原型链的理解和使用(一)
一些个人的理解,不一定是对的,仅供参考。
在JS中有函数和对象两个概念,而又有一切皆对象的概念及函数也是一个对象。所以可以说函数一定可以作为一个对象,而对象不一定是一个函数。
也可以说在js中对象分为两种:1.仅仅是一个对象2.既时对象又是函数(以下称为函数对象)
在JS中有一个概念:所有对象都有__proto__属性,而函数对象则还有prototype属性,可以以此区分出哪些是函数对象
在JS中有两个顶级的内置对象:Object和Function,这两个对象我测试了都属于函数对象。但有所不同的是:Object和Function的__proto__都是ƒ () { [native code] }(native code是已被编译为特定于处理器的机器码的代码,我反正就理解为不可见的源代码),Function的prototype为ƒ () { [native code] },Object的prototype是一个对象,里面有一些自己系统自定义的方法
在JS中有一个概念:对象是由函数对象生成的,并且对象的__proto__
属性指向函数对象的prototype
属性;函数(函数对象)也是由函数(函数对象)生成的,并且生成函数(函数对象)的prototype是一个系统默认生成的对象包含了两个属性(constructor和__proto__),这个constructor指向该函数对象自身及fun.prototype.constructor===fun,而__proto__则指向Object的prototype属性即fun.prototype.__proto__===Object.prototype。(注:这里讨论生成的对象并不包含Object和Function两个顶级对象,下面会专门讨论这两个内置对象)
我们平时在直接定义对象时:var obj = {};其实还是使用Object这个顶级函数对象Object在创建对象:var obj = new Object();,这种方式生成的对象只有__proto__
属性没有prototype
属性所以只是一个对象不是函数对象,而且obj.__proto===Object.prototype。我们在定义函数(函数对象)的时候:function fun (){};其实也还是使用的顶级函数对象Function在创建函数(函数对象):var fun = new Function();,而这时生成的fun则是一个函数对象因为它既有__proto__
属性又有prototype
属性,fun.__proto__===Function.prototype,fun.prototype则是一个对象,满足上一条的生成规则,是Object的实例对象。
使用一个自己定义的函数(函数对象)来生成的对象,如:function fun(){};var obj = new fun();生成的对象只有__proto__
属性没有prototype
属性所以只是一个对象不是函数对象,obj .__proto__===fun.prototype;
当我们在创建一个函数时:function fun(){};系统会自动为该函数生成一个prototype属性,该属性的__proto__指向Object.prototype,既然Object是一个函数,那么它的prototype按照规则也应该是在生成Object函数时赋予的,并且prototype中的__proto__应该指向某一个对象,而实际上Object的prototype中的__proto__为null,这就是原型链的终点。同样Object作为一个对象有__proto__属性,该属性指向创建它的函数的prototype属性,在JS中所有函数(函数对象)都是由Function生成的,所以可以说所有函数对象的__proto__属性都相等,等于Function的prototype属性包括Object函数对象。
Function这个顶级内置的函数对象,同样有__proto__和prototype属性,Function函数对象由它自身创建,所以它的__proto__和他的prototype相等。Function的prototype同样满足所有函数的prototype的生成规则,有一个constructo指向自身,一个__proto__指向Object的prototype属性。