Javascript的构造函数和构造函数属性
例如,在Chrome下调试以下程序就清楚地表明了这一点:。
然而,事情并没有那么简单。请看下面的代码:。
显然,此时obj的构造函数不再是创建它的函数,注意obj.name也是未定义的,所以修改构造函数的原型构造函数不会影响构造函数产生的对象。真正的原因是一个对象的构造函数就是它的构造函数的原型。默认情况下,这个原型有一个指向自身的构造函数属性。我认为Javascript是为了让每个对象的构造函数指向自己的构造函数而设计的,但是像上面这样的例子可以破坏这一点。此外,这个设计并不完美,一个很大的问题是继承时必须小心维护构造函数的方向。在最简单的继承中,子类构造函数的原型可以设置为父类的实例,父类实例的构造函数就是父类的构造函数,这样子类原型的构造函数就是父类的构造函数,这就使得子类每个对象的构造函数都是父类的构造函数。很容易造成混乱。最后,让我们回到上一篇文章遗留下来的问题。上面提到了一个Extjs官网给出的继承Observable的例子:复制代码的代码如下: employee=ext . extend(ext . util . observatory,{ constructor : function(config){ this . name=config . name;this . addevents({ ' fireed ' : true,' quit ' : true });//将配置好的侦听器复制到*这个*对象中,这样基类的//构造函数就会添加它们。this . listeners=config . listeners;//调用我们的超类构造函数完成构造过程。employee . super class . constructor . call(config)} });这个例子给人一种错觉,你可以重写父类的构造函数属性,从而改变子类的构造函数的行为。这对于没有深深扎根于Javascript的人来说是一种误导。我们来仔细看看Ext.extend的源代码:复制代码如下: extend : function(){//inline overrides var io=function(o){ for(var m in o){ this[m]=o[m];} };对象原型构造函数;返回函数(sb,sp,overrides){ if(ext . isobject(sp)){ overrides=sp;sp=sbsb=overrides.constructor!=oc?overrides . constructor : function(){ sp . apply(this,arguments);};//此处注}//省略下面的………}()号。请注意注释行。如果extend检测到overrides参数中有构造函数属性,也就是子类试图重写父类原型的构造函数时,会直接将子类设置为这个函数!这就是它的工作原理。但是我马上发现这个测试只存在于这个if语句块中,也就是两参数版本的extend中,所以用另外一个三参数版本的extend应该是无效的。编写要测试的代码:head title/title script type=' text/JavaScript ' src=' http 3360 ext-3 . 1 . 0/src/core/core/ext . js '/script type=' text/JavaScript ' function my class(){ this . id=' class ';} function SubLec(){ }//SubLec=ext . extend(SubLec,MyClass,{ constructor : function(){//this . override property=' OK ';//} //});SubClass=ext . ext(my class,{ constructor : function(){ this . override property=' OK ';} });var obj=new SubCe();alert(obj . override property);/script /head有两种写法,运行结果是第一种未定义,第二种OK。诶,同名函数只是参数不同,执行效果不同,有些出乎意料。而Extjs的官方文档对此没有任何解释。我们以后尽量用双参数版本。最后看几个表情,。
第一种是说函数原型的构造函数是本身,上面已经提到过了,没有问题;二是Function也是一个对象,它是函数构造器的一个对象,容易理解。三是函数构造器本身是一个对象,也是函数构造器的对象。最后一个其实相当于第三个,就是说Function对象的构造函数就是它自己……我真的不明白Function是怎么构造自己的。鸡生蛋,蛋生鸡?为了更进一步,它应该涉及到Javascript语言的具体实现,所以到此为止。嘿,Javascript本身还是有点复杂的。如果不是因为XMLHttpObject,它会大受欢迎,否则它还会在黑暗的角落里哭泣。作为应用程序开发人员,我们在编写自己的程序时,可能不会使用这些低级的东西。然而,这些高级特性在JS框架中被广泛使用,不可能将这些方法的效果和影响与详细的文档结合起来。所以开发人员还是需要尽可能的了解这些事情,以免死而不晓。上面的ext . ext函数就是一个例子。
版权声明:Javascript的构造函数和构造函数属性是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。