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方法调用父类的方法, 待续。。。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值