首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript的原形思考

2012-09-02 
JavaScript的原型思考原型:对象的共性描述?回归哲学?所有对象存在一个到达它原型的链接,原型是寄生在函数

JavaScript的原型思考

原型:对象的共性描述?回归哲学?


所有对象存在一个到达它原型的链接,原型是寄生在函数上的,当函数被new,则建立对象到原型的链接。对象和构造它的函数没有关系,和构造函数有关系的是原型。


如果函数不被new,则原型无用,或者没有原型,只有当函数被放到new的场景,函数则被挂上了一个原型,这个原型包含一个到这个函数的链接,这个原型也是对象,由Object构造出来,那么这个原型对象的原型就是Object.prototype的值。这个原型应该有两个属性:


1,constructor,指向这个原型所在的构造函数

2,_proto_,指向创建这个对象的构造函数的prototype值,即Object.prototype


所以原型出现在构造对象的场景,参与这个场景的有构造逻辑对象(函数),被构造空白对象(对象原生胚胎),对新生儿对象设置共性的对象(原型),三个角色合理造物。


造物过程是:


1,在某个构造函数F上用new运算符,new F();告诉引擎类F要造物了

2,引擎用Object构造一个对象放到F.prototype上,并把这个对象设置一个属性constructor指向这个F

3,引擎又用Object构造一个对象,把这个对象的_proto_属性指向F.prototype,再把这个对象作为this去调用F,执行F中的构造逻辑。


这个过程,其实Object也在构造对象,所以这个过程在Object造对象时也适用,最终由F构造出来的对象在执行F之前,它的_proto_已经指向Object.prototype了,Object.prototype上的属性和方法可被所有对象访问,执行F之后,F中做的所有事情都是把数据写到了对象之上,而写不到原型上。


重点或者问题:


1,Object.prototype本身也是对象,谁创建了它?

应该是引擎?还是Object?,我觉得是引擎,引擎搞了一个对象,设置一个constructor指向Object,_proto为空,然后再这个对象上放置toString,valueOf等属性。


如果我们不思考JavaScript的继承,那么一切都非常简单,任何一个函数携带的原型对象都是一个空对象,这个空对象由Object函数创建。


<script type="text/javascript">    alert(Object.prototype.__proto__ == null);  //true    alert(typeof Object.prototype.toString);//function    alert(Object.prototype.constructor == Object);//true    alert(Object.__proto__ == Function.prototype);//true    alert(Function.prototype.__proto__ == Object.prototype);//true    alert(Function.__proto__ == Function.prototype);//true</script>

?


总结:

在JavaScript中创建对象或者继承,只要瞄准函数携带的那个对象做手脚即可,改变它就可以改变原始的继承结构,但是那个对象虽然纯洁但是它指向了它寄生的函数,所以改变它之后需要修改constructor让它指回来。

函数本身也是对象,它由prototype这个链接到达携带的用于创建对象的原型和_proto_链接到达自己的原型。

热点排行