Web 技术研究所

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

ES6 继承自函数的 return 对象

  ES6 的 class 中定义了 extends 关键字,可以让定义的类继承与另一个类。然而 JavaScript 中的类实际上就是函数,那么 extends 一个函数,并且这个函数 return 一个对象会如何呢?如果可以继承,那就意味着我们可以动态地设置一个类实例化时的 this 指向。
  下面这个代码执行的结果是什么?
<script> function X() { return { x: 123 }; } class A extends X {} var a = new A(); console.log(a.x); </script>   babel 5 对这个代码输出 undefined,然而正确的结果应该是输出 123,babel 6 修复了这个 Bug。
  为什么我突然纠结这么边缘的东西?因为如果类实例的 this 可以动态指向的话我们可以做很多事情。比如在 Angular 中,如果不用 controller as 的话也可以直接将 this 指向 $scope。
function Scope($scope) { return $scope; } angular.controller('testCtrl', class extends Scope { static get $inject() { return [ '$scope' ]; } });   上面这段代码就是做了这件事。但由于 $scope 还是需要通过 $inject 来注入,所以逻辑有点诡异。如果想让 Angular 写起来更舒服的话也许得用上 ES7 的 decorator 才行。
  这里扯 Angular 也只是一个例子而已。无论是什么情况下,如果一个对象被使用得非常频繁,就可以考虑将它定义为 this。使用上面的方法就可以实现动态指向一个类的 this 为一个已知的引用。不过总感觉有点黑魔法,希望将来这个 feature 的规范不会被重定义。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^