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的主要内容,如果未能解决你的问题,请参考以下文章