dojo.declare函数相关(转)
dojo.declare(class,superclass,props) :返回一个构造函数 class:类名,字符串类型 superclass:父类,若无父类则为null;Function类型 props:属性和方法对象,即为作为原型中包含的属性和方法;其中一个关键的函数constructor是本类的初始化函数 例如: dojo.declare("my.classes.bar",my.classes.foo,{ // properties to be added to the class prototype someValue: 2, // initialization function constructor: function(){ this.myComplicatedObject = new ReallyComplicatedObject(); }, // other functions someMethod: function(){ doStuff(); } ); 先执行父类的构造函数,接下来是本类的constructor方法,constructor方法可以重写父类的属性值,所以constructor需要包含了父类构造方法的参数。 dojo.extend(constructor,props):一个对象的所有属性与方法会被加到构造函数的原型中,使得该构造器的所有实例都能够使用它们。 例如: var A = dojo.declare(null,{ m1: function(){}, s1: "Popokatepetl" }); Dojo.extend(A, m2: function(){}, f1: true, d1: 42 }); dojo.mixin(obj,props):一个对象props的所有属性与方法会加到另一个对象obj中,只拷贝原属性的成员,不拷贝原型中的成员。若obj中的属性与props的有相同,会被覆盖掉。 dojo.declare("acme.Base",null,{ constructor: function(properties){ // property configuration: dojo.mixin(this,properties); } });
转自:http://blog.csdn.net/hfy211/article/details/5495248
dojo.declare在dojo中被广泛使用,理解它将对弄懂dojo的代码有很大帮助。简单的说,dojo.declare提供了一种声明类的方式,通过它可以很方便的扩展其他类: dojo.declare("com.abc.MyDataProvider",dojo.widget.ComboBoxDataProvider, 如何使用产生的类呢?可以把该名字作为function类型的变量名来使用,如 dp = new com.abc.MyDataProvider(); dpClass = dojo.evalObjPath("com.abc.MyDataProvider"); 1. 覆盖的问题 dojo.widget.ComboxDataProvdier = function() { 而我们希望com.abc.MyDataProvider里声明的constructor方法覆盖基类的方法,那么上面那个dojo.declare的结果是不对的,这时查看该类的一个实例,你会发现它的constructor属性是基类的方法。 dojo.declare先会把dojo.widget.ComboBoxDataProvider.prototype上的属性设置到com.abc.MyDataProvider.prototype上,然后再把本身声明的属性加进去,因此com.abc.MyDataProvider.prototype的constructor属性正是我们期望的constructor函数,但是当执行该类的constructor方法时,它会调用基类的constructor,因此本来设置好的constructor函数就被基类的constructor函数覆盖了,于是override失败。 这里的ComboDataProvider作为一个class,不应该在构造函数里赋值constructor属性,这样会导致每个实例都会有一个constructor方法的实例,而这是没有必要的。应该用prototype来定义method属性: com.abc.MyDataProvider.prototype.constructor= function() { 2. 多重继承 { ... } 这有点类似java的单根继承、多个接口,不过要注意的是:如果dojo.widget.HtmlWidget和dojo.widget.ComboBox同时声明了一个函数属性,那么产生的类将会具有dojo.widget.ComboBox里声明的函数,这时如果dojo.widget.ComboBox因为是一个接口类而把该属性声明为空函数,而你希望继承的是dojo.widget.HtmlWidget上该方法的实现,那么结果就不对了,你得到的类的该方法将是dojo.widget.ComboBox上的声明的空函数。 本文来自CSDN博客:http://blog.csdn.net/hansoft/archive/2006/07/01/862776.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |