ajax构造器,Javascript 的构造函数和constructor属性

我们知道,默认情况下,对一个函数前面使用new,可以构造出一个对象。每一个对象都有一个constructor属性,这个constructor属性指向构造出该对象的函数。例如,在Chrome下调试如下程序,很清楚的展示了这点:

85dac664af9c22dc6134567317a279b0.png

然而事情并不是这么简单。再看下面的代码:

4f40378c739aa99ec7b14ae78dadd702.png

很显然,这个时候obj的constructor已经不再是创建它的函数,注意到obj.name也是undefined,因此修改构造函数的prototype的contructor并不会影响构造函数所产生的对象。真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让每个对象的constructor都指向自己的构造函数,然而有像上面的例子可以破坏这一点。另外,这样的设计其实也不很完美,一个很大的问题就是在继承的时候必须小心的维护constructor的指向。在最简单的继承中,可以把子类的构造函数的prototype设置为父类的一个实例,而父类的实例的constructor是父类的构造函数,从而子类的prototype的constructor是父类的构造函数,这就造成了子类的每个对象的构造函数都是父类的构造函数。这是很容易引起困惑的。

最后,再回到上一篇遗留下来的问题,上文谈到Extjs官网给出的一个继承Observable的例子:

Copy to Clipboard

aa627a6b0d9a89f22bcea6370439fcec.gif引用的内容:[www.veryhuo.com]

Employee = Ext.extend(Ext.util.Observable, {

constructor: function(config){

this.name = config.name;

this.addEvents({

"fired" : true,

"quit" : true

});

// Copy configured listeners into *this* object so that the base class's

// constructor will add them.

this.listeners = config.listeners;

// Call our superclass constructor to complete construction process.

Employee.superclass.constructor.call(config)

}

});