dojo.declare 详解

来源:互联网 发布:19世纪的俄国 知乎 编辑:程序博客网 时间:2024/05/01 03:43

dojo.declare在dojo中被广泛使用,理解它将对弄懂dojo的代码有很大帮助。简单的说,dojo.declare提供了一种声明类的方式,通过它可以很方便的扩展其他类:

  dojo.declare("com.abc.MyDataProvider", dojo.widget.ComboBoxDataProvider,
   {
    name: "My DataProvider",
    constructor: function() {
     ...
    }
   }
  );
这里类名com.abc.MyDataProvider是用字符串来表示的,dojo.widget.ComboBoxDataProvider是被扩展的基类,第三个参数是个object,用来定义该类的属性。 dojo.declare产生的类所具有的属性将是基类的属性和大括号中指定的属性的集合,如果大括号中声明了和基类同名的属性,则基类属性将被覆盖,但也有例外,下面将会说明。生成类的constructor将会调用基类的constructor方法,然后调用本身的constructor方法,该方法可以来类本身,也可以来自其基类,如果都没有还可以来自dojo.declare中可选的一个参数,否则将是个空函数。

如何使用产生的类呢?可以把该名字作为function类型的变量名来使用,如

  dp = new com.abc.MyDataProvider();
可见dojo.declare产生了一个指定名称的变量,引用创建出的class(function) 也可以:

  dpClass = dojo.evalObjPath("com.abc.MyDataProvider");
  dp = new dpClass();
这种方式比较适合通过类名字符串来使用该类。

1. 覆盖的问题
如果基类是这么声明的:

  dojo.widget.ComboxDataProvdier = function() {
   this.constructor= 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() {
   ...
  }
由此可见,用dojo.declare来override还是有个前提的,那就是要override的method必须用prototype定义,而不是在constructor里。

2. 多重继承
dojo.declare是可以扩展多个类的,如: dojo.declare("dojo.widget.html.ComboBox", dojo.widget.HtmlWidget,,

{ ... } 
); 这时第一个类dojo.widget.HtmlWidget将会被作为super class,于是其prototype上的属性将会进入dojo.widget.html.ComboBox.prototype,然后其他基类prototype上的属性也会被mixin到dojo.widget.html.ComboBox.prototype,最后是类本身声明的属性。当然在constructor只会调用基类的construtor。

这有点类似java的单根继承、多个接口,不过要注意的是:如果dojo.widget.HtmlWidget和dojo.widget.ComboBox同时声明了一个函数属性,那么产生的类将会具有dojo.widget.ComboBox里声明的函数,这时如果dojo.widget.ComboBox因为是一个接口类而把该属性声明为空函数,而你希望继承的是dojo.widget.HtmlWidget上该方法的实现,那么结果就不对了,你得到的类的该方法将是dojo.widget.ComboBox上的声明的空函数。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 愿意和做朋友不愿意做情侣怎么办 欠信用卡碰到第三方不愿协调怎么办 qq密码忘记了申诉不回来怎么办 当你老公烦你了你该怎么办 自己有漂亮媳妇还经常想去嫖怎么办 微信号封了找不到好友解封怎么办 别人总是提起你的黑历史怎么办 换了手机微信登录不上怎么办 qq不小心清空了聊天记录怎么办 人家介绍了外地媳妇跑了怎么办 火锅想吃香菜牛肉没有签子串怎么办 想读外省大学但家人反对怎么办 13岁被同学忽视他不知道怎么办 老婆发现老公在微信暧昧聊天怎么办 老婆微信和别人聊天暧昧我该怎么办 淘宝修改标题宝贝被删了怎么办 百度网盘上的相片变的模糊怎么办 微信2不小心删了怎么办 房屋没交接前给钥匙出现问题怎么办 微信银行卡注销零钱没了怎么办 贴小广告电话被城管上报停机怎么办 没有id密码怎么办已经锁死了屏幕 电信电话卡注销了里面的钱怎么办 支付宝绑定的手机号成空号了怎么办 支付宝绑定的手机号空号了怎么办 支付宝绑定的手机号码空号了怎么办 注册支付宝的手机号成空号了怎么办 银行保本理财回执单丢了怎么办 电脑连不上网ip地址错误怎么办 邮箱填错了没收到面试通知怎么办 电信烽火网络机顶盒零配置中怎么办 专技天下学错科目了怎么办 注册公司行业大类选错了怎么办 私营企业开的车比领导好怎么办 有公司有商标无生产资质怎么办 天猫店铺使用商标被注销怎么办 入仓件快递员搞错入仓号怎么办 商标注册证盖了自己公司的章怎么办 普通机打发票作废票丢了怎么办 淘宝店铺被买家投诉工商介入怎么办 淘宝退货运单号填错了怎么办