- 时间:2021-08-03 08:28 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:Javascript的构造函数和constructor属性
例如,在Chrome下调试如下程序,很清楚的展示了这点:
[url=http://images.cnblogs.com/cnblogs_com/yinzixin/WindowsLiveWriter/Javascriptconstructor_B25A/image_2.png][img]http://files.jb51.net/upload/2010-1/20100109234805106.png[/img]
[/url]
然而事情并不是这么简单。再看下面的代码:
[url=http://images.cnblogs.com/cnblogs_com/yinzixin/WindowsLiveWriter/Javascriptconstructor_B25A/image_4.png][img]http://files.jb51.net/upload/2010-1/20100109234805547.png[/img]
[/url]
很显然,这个时候obj的constructor已经不再是创建它的函数,注意到obj.name也是undefined,因此修改构造函数的prototype的contructor并不会影响构造函数所产生的对象。真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让每个对象的constructor都指向自己的构造函数,然而有像上面的例子可以破坏这一点。另外,这样的设计其实也不很完美,一个很大的问题就是在继承的时候必须小心的维护constructor的指向。在最简单的继承中,可以把子类的构造函数的prototype设置为父类的一个实例,而父类的实例的constructor是父类的构造函数,从而子类的prototype的constructor是父类的构造函数,这就造成了子类的每个对象的构造函数都是父类的构造函数。这是很容易引起困惑的。
最后,再回到上一篇遗留下来的问题,上文谈到Extjs官网给出的一个继承Observable的例子:
[url=http://www.1sucai.cn/upload/2010-1/20100109234805492.png][img]http://files.jb51.net/upload/2010-1/20100109234805754.png[/img]
[/url]
第一个是说函数的prototype的constructor是自己,这个上文已经谈到,没有问题;第二个是说函数也是一个对象,它是Function构造函数的一个对象,也还好理解;第三个是说Function构造函数本身一个对象,它还是Function构造函数的一个对象;最后一个其实是和第三个等价的,是说Function对象的构造函数是它自己…… 我确实有点想不明白Function是怎么自己构造自己的?鸡生蛋,蛋生鸡?要再追究下去就应该涉及到Javascript语言的具体实现了吧,就此打住。
哎,Javascript这个语言本身还是有点复杂啊。要不是有了XMLHttpObject,让它大红大紫了下,否则它还在黑暗的角落里暗自哭泣呢。
作为应用程序开发人员,或许我们自己写程序的并不会用到这些底层的东西,但是,JS框架中却大量的使用了这些高级特性,而且再详尽的文档也不可能把这些方法的作用、影响一一道来,所以开发人员还是需要尽量理解这些东西,以免死了还不知道怎么回事。上面的Ext.extend函数就是一个例子。