日期:2014-05-16  浏览次数:20378 次

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函数创建。


?写道
详解如下:

new Object()出来的对象A

Object.prototype = [引擎创建的对象] constructor 指向Object, _proto_为空,被引擎设置toString,valueOf等属性。
A对象的_proto_指向Object.prototype


new String出来的对象B

String.prototype = [由Object构造出来的对象] constructor 指向String, _proto_指向Object.prototype。
B对象的_proto_指向String.prototype


任何一个函数F
new F出来的对象X
F.原型是由Object创建出来的对象,这个对象的constructor指向F,_proto指向Object.protype

?



可以看出顶端是Object.prototype,其他全部平行