CODE大全
版权声明:本文为博主原创文章,未经博主允许不得转载。

避免在类中使用名称引用自己

发布时间:『 2017-07-25 15:46』  博客类别:WEB前端  阅读(1120) 评论(0)

对于写惯了 ES5 的原型继承的人可能很少会考虑自己的构造器被继承的情况。因为在 ES5 时代,原型继承通常只是为了共享一些公用的方法而被使用,和真正「类」的概念相差好多。而写 ES6 的 class 就应该考虑更多因素,我们应该像原生的那些类一样优雅地处理派生类中「自己」这个概念。

我们经常会在类的方法或静态方法中创建类的新实例。如果一个类的初始化是一个异步行为,我们通常不会直接 new,而是在类上提供一个静态方法来创建。比如

class A {
  constructor(response) {
    this.response = response;
  }
  static create(url) {
    return fetch(url).then(response => {
      return new A(response);
    });
  }
  clone() {
    return new A(this.response);
  }
}

上面的代码并不友好,因为它强制了「自己」的概念是这个名为 A 的类。实际上如果被继承之后,「自己」的概念应该是别的。所以这种情况我们应该把 A 换成具体的引用。

在静态方法中,this 就指向当前类,所以上面代码 create 中的 A 可以用 this 代替,而成员方法中的 this 指向的是实例。

所以这个代码应该写成:

class A {
  constructor(response) {
    this.response = response;
  }
  static create(url) {
    return fetch(url).then(response => {
      return new this(response);
    });
  }
  clone() {
    return new this.consturctor(this.response);
  }
}

最后要注意的是对于派生类,constructor 中本身并没有 this,需要先 super() 之后才可以得到 this。或者如果碍于某些情况无法 suepr 可以使用 new.target 来获取当前被实例化的类的引用。


——— 全文完 ———
如有版权问题,请联系532009913@qq.com。
关键字:   JavaScript     ES6  
评论信息
暂无评论
发表评论
验证码: 
Powered by CODE大全 | 鄂ICP备14009759号-2 | 网站留言 Copyright © 2014-2016 CODE大全 版权所有