TAT.dnt 向 ES6 靠齐的 Class.js
In 未分类 on 2015年04月19日 by view: 5,068
4

写在前面

在 2008 年的时候,John Resig 写了一 Class.js,使用的方式如下:

这种看上去很酷很方便的继承方式,居然有一个致命的缺陷。那就是:

当父类 A 有一个方法 a, 子类 B 也有一个方法 a 的时候,仅仅只有子类 B 中的方法 a 才能访问父类 A 中的方法 a,子类 B 中的其他方法从此就无法访问到父类 A 中的方法 a。虽然这种场景很少,但是不完美啊不完美!! 所以就有了今天向 ES6 看齐的 Class.js。

ES6 class

先来看看 ES6 中的 class 继承:

Class 之间可以通过 extends 关键字,实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

上面代码定义了一个 ColorPoint 类,该类通过 extends 关键字,继承了 Point 类的所有属性和方法。但是由于没有部署任何代码,所以这两个类完全一样,等于复制了一个 Point 类。下面,我们在 ColorPoint 内部加上代码。

上面代码中,constructor 方法和 toString 方法之中,都出现了 super 关键字,它指代父类的实例(即父类的 this 对象)。

上面来自 ruanyifeng 的 es6 入门:http://es6.ruanyifeng.com/#docs/class

Class.js

下面是向 ES6 靠齐的 Class.js

没有想说的,都在注释里...

测试

使用和 ES6 一样,除了构造函数 ctor 方法可以直接通过 this._super 方法去访问 parent.ctor,
其余的方法可通过 this._super. 方法名 (xxxx) 去访问父类方法, 如果自身没有定义父类同名的方法,也可以直接通过 this. 方法名去访问父类的方法。

欢迎使用,玩得愉快。

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2015/04/xiang-es6-kao-qi-di-class-js/

  1. doocal 2017 年 11 月 3 日

    导致父类的 init 执行了 2 次

    • doocal 2017 年 11 月 3 日

      我测试有问题。。。。抱歉.

    • doocal 2017 年 11 月 5 日

      这个改造的类有问题会导致父类的 ctor 执行多次 (name == “ctor”,new this() 两个地方)。可以直接打印上图示例 ctor 日志。感觉是 @TAT.dnt 没有仔细看原作者的意图在乱改一通。原类无此问题。

  2. AlloyRenderingEngine继承 – 剑客|关注科技互联网 2015 年 4 月 28 日

    […] 前几天发了篇向 ES6 靠齐的 Class.js,当初 jr 为什么不把父类的实例暴露给子类,其原因还是为了延续原型继承的习惯,子类重写就会覆盖掉父类的方法,父类的方法就会丢,如下面的代码,就堆栈溢出了: […]

发表评论