dojo源码阅读之declare

Posted yang_chuanlong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dojo源码阅读之declare相关的知识,希望对你有一定的参考价值。

dojo是一个开源的javascript 类库,它提供了一个declare函数来方便的实现多重继承。下面看下declare的实现原理。

1, 使用declare声明一个类(未继承其他类的类)。

let Human = declare([], 
    name: "",
    constructor:function(args)
        for(let i in args) 
            this[i] = args[i];
        
    ,
    sayName:function()
        console.log(this.name);
    
);

上面代码声明了一个Human类,declare的第一个参数为一个空数组,说明Human没继承其他类,第二个参数为一个object, 该object包含了Human类之身的属性和方法。然后就可以使用该类实例化一个对象。

let h = new Human(
     name: "alex"
);

declare是如何实现上面Human类的呢,declare源码第850行, 在该行代码中,bases既是Human所继承的类,上例中Huamn没继承其他类,所以Human = singleConstructor 运行后的返回值, 既一个匿名函数。暂且将该匿名函数计为anaymous.

那么declare实现上述Human类的原理大致可用下面伪代码表示。

 let Human = anaymous, proto = ;
 for (let p in props)  //props为传给declare的第二个object参数
    proto[p] = props[p];

anaymous.prototype = proto;
proto.constructor = anaymous;

当然Human.prototype还会被添加上像getInherited, inherited, isInstanceOf等方法。

2, 使用declare声明一个子类。

先声明父类C1和C2

p1 = 
     constructor:function(),
     sayName:function() 
         console.log("sayName in p1")
     
 ;
        
 C1 = declare([], p1);
 p2 = 
    sayAge:function() 
    console.log("sayAge in p2")
    ,
;
C2 = declare([], p2);

然后就和可以使用下面代码声明子类C3

p3 = 
  f: function() 
  
;
C3 = declare([C1, C2], p3);

其原理可用如下代码表示, 详细代码:多重继承

f = new Function();
f.prototype = C1.prototype; //mixin C1.prototype to new C3.prototype.
proto = new f()
for(var p in C2.prototype)
    proto[p] = C2.prototype[p];


f = new Function(); //mixin C2.prototype to new C3.prototype.
f.prototype = proto;
proto = new f();

for(var p in p3) 
    proto[p] = p3[p];


C3 = chainedConstructor()
C3.prototype = proto;
3, 使用inherited方法调用父类的方法, 待续。。。






以上是关于dojo源码阅读之declare的主要内容,如果未能解决你的问题,请参考以下文章

dojo源码阅读之dojo/Stateful

dojo源码阅读之dojo/Stateful

Dojo常用函数

Dojo ValidationTextBox在Enter上显示missingMessage

dojo常用函数

dojo常用函数