• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ES6 中的 this & super:babel 和 typescript 都错了

原作者: [db:作者] 来自: [db:来源] 收藏 邀请


好久不写了,今天推篇简单的。


众所周知,javascript 的继承方式也和 C、Java 有很大不同,javascript 使用原型继承,虽然在 ES6 中引入了关键字 class,也只是语法糖而已。看如下代码:

  1. class A {};

  2. typeof A;

我们定义了一个类 A,但是查看 A 的类型却不是 class,也不是 object,而是 function

当我们需要继承时,是基于原型链的。当我们访问 A.name 时,引擎首先会在 A 中找 name 属性,如果没有则顺着原型链一直找,当找到原型链顶端依然没有时,则返回 undefined

在 ES6 中不仅引入了 class,也引入了 super,用于在本类中访问父类。那么问题就来了,看下面代码:

  1. "use strict";

  2. class Point {

  3.  getX() {

  4.    console.log(this.x); // C

  5.  }

  6. }

  7. class ColorPoint extends Point {

  8.  constructor() {

  9.    super();

  10.    this.x = 2;

  11.    super.x = 3;

  12.    console.log(this.x)   // A

  13.    console.log(super.x)  // B

  14.  }

  15.  m() {

  16.    this.getX()

  17.  }

  18. }

  19. const cp = new ColorPoint();

  20. cp.m();

在子类中,先把 this.x 赋值为 2,再把 super.x 赋值为 3

当我看到这段代码后的第一直觉是,应该输出 2、 3、 2。我觉得子类的 x 是 2,父类的 x 是 3

当我把代码放到 Chrome(58.0.3029.110 (64-bit)) 中运行时,输出的结果居然是 3、 undefined、 3

考虑到有些老版本浏览器不支持 ES6 特性,于是我把代码放到 Babel Repl(6.24.2) 中执行,得到的结果是 2、 undefined、 2

随后我又把这段代码放到了 TypeScript 2.3 中,得到的结果是 2、 3、 2,居然和我的直觉是一致的。Anders Hejlsberg 不愧是 C# 之父,有人调侃 TypeScript:前端这么火,Hejlsberg 为了怕 C# 程序员失业后挨饿,因此发明了 TypeScript。


A B C
Builtin 3 undefined 3
babel 2 undefined 2
TypeScript 2 3 2

最后请教了贺师俊:

隐隐觉得 javascript 要变成 java 了。再次印证了那句话:一部分人害怕 javascript 会变成 java,而另一部分人正在努力把它变成 java


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
typescript 中 type 和 interface 的区别发布时间:2022-07-18
下一篇:
Typescript-联合类型发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap