日期:2014-05-16 浏览次数:20378 次
原型:对象的共性描述?回归哲学?
所有对象存在一个到达它原型的链接,原型是寄生在函数上的,当函数被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函数创建。
?
可以看出顶端是Object.prototype,其他全部平行