看到的一个简单实现具有super作用的代码:

关键代码如下:

这里的_super()只有调用父类相同名字function的作用,没有替换父类this的作用,用法比较简单,大致如下:

这是一段非常有意思的实现super()的代码,让我们看看里面比较有意思的东西。

/xyz/.test(function(){ xyz;})?/\b_super\b/ :/.*/

这个比较有意思,/xyz/.test(function(){ xyz;})想测试的是是否可以检测到一个function里面是否包含特定的关键字,因为test右边是一个function,因此会先变成一个string进行测试,也就是/xyz/.test((function(){ xyz;}).toString()),正常情况返回true,如果可以检测的话,那么我们就能用相同的方法检测到一个function里面是否有关键字_super。/\b_super\b/两边的\b表示字符边界,表示是一个独立的_super,不是来自字符串的_super。

关键过程

background Layer 1 基类 子类a init() hello() word() 1.创建子类a 2.挂载方法 initializing=true initializing=false A类 子类a 子类b init() hello() 1.创建子类b 2.挂载方法 initializing=true initializing=false B类 init() hello() word() 因为initializing为true 不调用init 返回一个闭包,内部劫持_super方法, _super指向子类a的相同方法 闭包里同时包含下面的方法 子类b init() hello() word() var b=new B(); 因为initializing为false 调用init

整个过程还是非常巧妙的,每次调用一个extend,内部利用之前的类产生一个新的类,然后比较传入的方法列表和之前类的方法,如果相同的话就返回一个闭包,必包里面劫持了_super方法,让它指向原始类的方法,同时包含了传入的方法,执行的时候两个方法就会一起执行。

上面的init方法执行的时机设计的也是非常巧妙,只有最后一个被实例化的类才会执行init方法。

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字