Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

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

  对于写惯了 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 来获取当前被实例化的类的引用。
网名:
54.159.71.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^