Babel.js 如何将类声明编译成 ES2015?

2023-11-26

我当前的任务是将 JavaScript 组件 ES5 转换为 ES6(用 Babel.js 编译)。在使用类和 Babel.js 之前,我们进行原型设计以从其他组件获取函数。

com.company.js.ComponentA.prototype = new com.company.js.utils.UltraFunctions()

现在当使用 Babel.js 并将 ComponentA 变成一个类时

class ComponentA {
  contructor(){
    this.property = "Proppy";
  }
  doStuff() {
    console.log("doStuff");
  }
}

现在,当我在实例化该组件后对其进行分析时,会发生什么情况,我现在看到了两个级别的原型。第一个原型保存“属性” - 第二个原型嵌套在第一个原型中,保存所有功能,在本例中为“doStuff”。这带来了遗留组件的问题,这些组件不应该转换为类(目前)。因为这些组件是通过第二级原型放入的,所以它们会覆盖包含由 Babel.js 编译的“合成”类的功能的原型。

我不是在寻求解决方案。我只是想确定 Babel.js 将类转换为 ES5 JavaScript 的假设是否正确。特别是如上所述创建两级原型的事实。

Update

抱歉我误解了第一个原型!正如 @T.J.Crowder 在评论中所说,第一个是实例 - 因此“属性”被粉碎到实例中,同时通过原型设计将函数插入到“第一”级原型。因此,将我所说的所有内容替换为第二级到第一级,第一级到实例。


我只是想讨论 Babel.js 如何将类转换为 ES5 Javascript。

Babel 使用了很多辅助函数,或者我会说“只需查看转译结果”。 :-)

With ES2015, it's a really simple mapping, because the class syntax was deliberately kept really basic for this first version (ES2016 was going to extend it, but the proposals¹ didn't quite make it so they'll be later, probably ES2017 ES2018 ES2021 or ES2022).

class允许我们定义:

  • 构造函数(通过class and constructor)
  • 构造函数的prototype对象的原型(通过extends)
  • 放在构造函数上的方法prototype object
  • 放置在构造函数本身上的方法(static)
  • 一种简洁且可移植地引用基“类”构造函数及其原型信息的方法

So this:

// Base "class":
class Base {
    // The code for `Base` goes in this special `constructor` pseudo-method:
    constructor() {
        this.baseProp = 42;
    }

    // A method to put on the `prototype` object (an "instance method"):
    baseMethod() {
        console.log(this.baseProp);
    }

    // A method to put on the constructor (a "static method"):
    static foo() {
        console.log("This is foo");
    }
}

// Derived "class":
class Derived extends Base {
//            ^------------------ defines the prototype behind `Derived.prototype`
    // The code for `Derived`:
    constructor() {
        // Call super constructor (`Base`) to initialize `Base`'s stuff:
        super();

        // Properties to initialize when called:
        this.derivedProp = "the answer";
    }

    // Overridden instance method:
    baseMethod() {
        // Supercall to `baseMethod`:
        super.baseMethod();

        // ...
        console.log("new stuff");
    }

    // Another instance method:
    derivedMethod() {
        this.baseMethod();
        console.log(this.derivedProp);
    }
}

变成我们在 ES5 中可能编写的内容(如果我们不使用任何辅助函数),如下所示:

// This combines the name defined by `class` with the code defined in `constructor`:
var Base = function() {
    this.baseProp = 42;
};
// The "instance" method:
Base.prototype.baseMethod = function() {
    console.log(this.baseProp);
};
// The "static" method:
Base.foo = function() {
    console.log("This is foo");
};

// The derived constructor
var Derived = function() {
    // Call super constructor (`Base`) to initialize `Base`'s stuff:
    Base.call(this);

    // Properties to add when called:
    this.derivedProp = "the answer";
};

// This was done by `class` and `extends`:
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;

// Overridden instance method:
Derived.prototype.baseMethod = function() {
    // Supercall to `baseMethod`:
    Base.prototype.baseMethod.call(this);

    // ...
    console.log(this.derivedProp);
};

// Another instance method:
Derived.prototype.derivedMethod = function() {
    this.baseMethod();
    console.log(this.derivedProp);
};

以上注意事项:

  • constructor成为构造函数
  • All non-constructor, non-static方法成为原型方法
  • static方法被分配给构造函数上的属性
  • 属性只是像往常一样的属性
  • 创建要放置的对象prototype派生构造函数的属性是通过Object.create(Base.prototype), not new Base().
  • constructor调用基本构造函数作为其第一个操作。
  • 致电superES5 版本中的方法(Base.prototype.baseMethod.call(this);) 很麻烦而且容易出错,这是新语法的优点之一

一些提案将显着延长class syntax:

  • 类公共实例字段和私有实例字段
  • 私有实例方法和访问器
  • 静态类字段和私有静态方法

截至 2021 年 1 月,V8(Chrome、Chromium、Brave、Node.js 等中的 JavaScript 引擎)支持上述所有内容。 SpiderMonkey(在 Firefox 和其他浏览器中)和 JavaScriptCore(在 Safari 中)也紧随其后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Babel.js 如何将类声明编译成 ES2015? 的相关文章

  • 使用 获取用于 javascript 的 RSA 密钥?

    我的 Web 项目需要一个 RSA 密钥对 虽然有一些库 但我认为依靠浏览器 为了安全性和速度 为我生成密钥是个好主意 是否可以使用注册机或其他浏览器 API 来执行此操作 我不知道如何从注册机获取密钥 它们似乎是在提交时生成的 但我不想将
  • Google reCaptcha 永远加载

    我在我的网站上使用 Google 的 reCaptcha 2 0 它曾经运行良好 但自从我向公众开放我的网站并获得了更多用户后 recaptcha 不再适用于大多数用户 它加载得很好 但一旦用户单击 我不是机器人 复选框 它会永远加载并且从
  • JavaScript 中的“new”关键字是什么?

    The newJavaScript 中的关键字第一次遇到时可能会很混乱 因为人们倾向于认为 JavaScript 不是面向对象的编程语言 它是什么 它解决什么问题 什么时候合适 什么时候不合适 它做了 5 件事 它创建一个新对象 这个对象的
  • 有没有办法监控页面上运行的 JavaScript 函数?

    有没有办法查看页面上正在执行哪些功能 如果我在页面上加载外部脚本 是否可以动态更改函数的功能或阻止其运行 HTML5 http www w3 org TR html5 scripting 1 html establish script bl
  • 缓存 firestore 中 get 的第一个实现

    我希望 firestore 每次都先从缓存中获取数据 根据 Firestore 文档 传递 缓存 或 服务器 选项必须启用相同的功能 下面的例子 db collection cities where capital true get cac
  • TRACKER:错误TRK0005:无法找到:“CL.exe”。该系统找不到指定的文件

    我尝试在 Windows 8 上的 Node js 项目中执行以下命令 npm 安装 电子邮件受保护 cdn cgi l email protection 但我收到一个错误 我不知道如何处理 TRACKER 错误TRK0005 无法找到 C
  • 更新 Google 地图流量层而无需重新加载页面

    我的页面中嵌入了 Google 地图 我使用 initMap js 函数来初始化地图 function initMap var map new google maps Map document getElementById t map zo
  • AngularJS 输入字段未从控制器内的 setTimeout 更新

    我正在使用 AngularJS 支持的页面 并且我需要在只读输入文本字段内显示正在运行的时钟 与data ng model 为了模拟运行的时钟 我使用了 JavaScript 调度程序setTimeout每 1000 毫秒调用一个函数 该函
  • 从网站存储数据的最简单方法(在服务器端)

    我有一个非常简单的网站 实际上是单页 有一个输入字段和一个按钮 我需要将用户提交的数据存储在服务器端的某个位置 完美的方法可能是简单的文本文件 并在每次单击按钮后附加新行 日志文件也可以 据我了解 JavaScript 本身是不可能的 我在
  • 哪些网络浏览器不支持 Javascript?以及如何识别客户端使用的是哪个浏览器?

    是否有不支持 javascript 的网络浏览器 以及如何确定客户端是否正在使用这些浏览器之一 或者客户端禁用了javascript 是否有不支持 javascript 的网络浏览器 当然 Lynx http en wikipedia or
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 类返回语句不打印任何输出

    我正在学习课程 但遇到了问题return语句 它是语句吗 我希望如此 程序什么也没有打印出来 它只是结束而不做任何事情 class className def createName self name self name name def
  • (0, eval) () 的作用是什么? [复制]

    这个问题在这里已经有答案了 以下内容来自这个问题 https stackoverflow com questions 14119988 return this 0 evalthis 14120023 14120023 function q
  • ReferenceError 和全局对象

    在浏览器中的 JavaScript 中window是全局对象 这意味着在全局范围内定义的每个变量都是window 那么为什么我会得到这个结果 console log window foo No error logs undefined co
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • Javascript:更改输入值时设置光标位置

    当您输入公式时 我试图在我的应用程序中重现类似于 Microsoft Excel Google Sheets 的用户体验 并且您可以使用不同的公式和变量来自动完成下拉菜单 为此 在验证自动完成功能后 我希望能够控制光标的位置 例如 如果我输
  • 如何使用 Jest 测试对象键和值的相等性?

    我有一个mapModule我在其中导入组件并导出它们 import ComponentName from components ComponentName export default name ComponentName 我该如何测试ma
  • CKEditor 类被剥离

    我有一个自定义插件 它添加了一个带有附加类的链接 当我使用 源 按钮查看此内容时 它会显示该类并且看起来应有的样子 但是 当我返回 WYSYWIG 视图并再次查看源代码时 该类已被删除 知道如何阻止这种情况发生吗 在此先感谢您的帮助 Che

随机推荐

  • 将 MDB 转换为 CSV [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个 MS Access mdb 文件 我需要将其转换为 CSV 文件 我该怎么做 请不要向我指出任何免费软件 提前致谢 另一个有用的工具是 mdbtools http mdbt
  • 如何捕获此错误:“注意:未定义的偏移量:0”

    我想捕获这个错误 a 1 jfksjfks try b a 0 catch Exception e echo jsdlkjflsjfkjl Edit 事实上 我在以下行中收到此错误 parse xml gt children 0 gt ch
  • SSIS 2012 使用项目部署模型将值从子包传递到父包

    我正在使用新的项目部署模型 我有一个名为 ETL 的主包 我的 ETL 包所做的第一件事是运行一个名为 get SFTP files 的包 如图所示 在获取 SFTP 文件中 foreach 循环获取 ClientID 我如何将此值传递回父
  • 如何在 Android Studio 中创建我自己的“重新格式化代码”样式?

    在 Eclipse 中 窗口 gt 首选项 gt Java gt 代码样式 gt 格式化程序 有一个工具可以创建我自己的格式样式并将其应用到代码中 有没有办法在 Android Studio 中做到这一点 对于 Java 代码 要更改格式化
  • 有类似 C 语言的 STL(矢量、地图...)之类的库吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C 容器类 库 有没有好的C语言集合库 在 C 中 您有一个非常有用的标准模板库 STL 它具有向量 映射 集合等结构 如果我使用纯 C 是否有任何库提供类似的结构 函数 Thanks glib是一个
  • 如何更改 Spring Boot 中允许的标头

    我目前正在使用 Auth0 和 Angular 2 GUI 它发送以下类型的标头 x xsrf token 在对 Spring Boot API 的请求中 我收到错误 XMLHttpRequest 无法加载http localhost 30
  • 使用 Zend_Auth 保护所有控制器

    我如何全局保护我的所有控制器 除了我的登录控制器 以确保我的应用程序在所有点都是安全的 没有ajax调用的隐藏后门等 我想我可以把它放在我的引导文件中 但这感觉不对 我试图避免向每个控制器添加任何代码 建议 edit 这是对 singles
  • 检查字符串是否仅包含字母+空格?

    我想编写一个传递字符串的静态方法 并检查该字符串是否仅由字母和空格组成 我可以根据需要使用 String 的方法 length 和 charAt i 我在想类似以下的事情 对伪代码感到抱歉 public static boolean onl
  • Google Drive Android API (GDAA) getResourceId() 返回 null(计时问题)

    当测试时删除 垃圾箱中讨论的功能SO 22295903 我遇到了这个问题 1 创建一个包含内容的文件 GoogleApiClient gac DriveFile createFileWait DriveFolder fldr String
  • Imagick - 无法从 URL 读取图像文件。

    我使用此片段来读取不同网站上的图像 image new Imagick http lp hm com hmprod set key source value model 2012 P01 05156 06204 80 1175 4 jpg
  • 检查变量是否为 SRE_Match

    我需要检查变量是否是正则表达式匹配对象 print type m 返回类似的内容 lt sre SRE Match object at 0x000000000345BE68 gt 但是当我导入时 sre并尝试执行type m is SRE
  • 在 OS X 上安装 Spatialite for python (GeoDjango)

    我正在费尽心思地尝试安装 Spatialite for GeoDjango 我已经在使用 Homebrew 它通常很简单且方便 所以我最初尝试遵循自制说明对于 GeoDjango 但这无法安装任何数据库 即 Spatialite 下一步是尝
  • Valgrind 合法的“可能丢失”字节示例

    我看到 valgrind 将内存泄漏分为 肯定输了 间接损失 可能丢失 仍然可以到达 压制 我刚刚修复了一个泄漏 其中 可能丢失 是主要问题 The 文件说 可能丢失意味着你的程序正在泄漏内存 除非你对指针做了不寻常的事情 这可能导致它们指
  • 将 MySQL 事件通知返回给 Delphi 应用程序

    G Day 有谁能够提供一些关于如何通知我的 Delphi 应用程序我的 MySQL 数据库中的特定记录已更改的指示吗 有类似 Interbase 事件系统的东西吗 我看过的想法 Q4M http q4m 31tools com 优点 无需
  • 我可以让 git 以合理的顺序打印 x.y.z 样式标签名称吗?

    考虑这个版本号列表 0 3 0 0 3 1 0 3 8 0 3 9 0 3 10 0 3 11 git tag将按以下顺序打印它们 0 3 0 0 3 1 0 3 10 0 3 11 0 3 2 我有什么办法可以使git tag按 数字 顺
  • 如何在 Python 中创建子进程?

    我想创建一个流程的子流程 展示如何实现这一目标的工作示例是什么 从子流程文档 如果你想得到输出 gt gt gt import subprocess gt gt gt output subprocess Popen uname a stdo
  • 如何在 ember.js 的组件中获取商店

    我究竟如何获得组件内部存储的句柄 我正在尝试创建一个从商店返回结果的自动完成组件 App AutoCompleteComponent Ember Component extend Ember Properites content Ember
  • 欧拉计划问题 14(Collat​​z 问题)

    为正整数集定义以下迭代序列 n gt n 2 n 为偶数 n gt 3n 1 n 为奇数 使用上面的规则并从 13 开始 我们生成以下序列 13 40 20 10 5 16 8 4 2 1 可以看出 这个序列 从 13 开始 到 1 结束
  • NSURLRequest:如何处理重定向的帖子?

    我对 NSURLRequest 和伴奏 实现进行了尝试和测试 它非常适合给定 URL 的 GET 和 POST 但是 我现在想要移动 URL 的目标而不更改应用程序使用的 URL 因此我打算通过 DNS 提供商使用 Webhop 重定向 这
  • Babel.js 如何将类声明编译成 ES2015?

    我当前的任务是将 JavaScript 组件 ES5 转换为 ES6 用 Babel js 编译 在使用类和 Babel js 之前 我们进行原型设计以从其他组件获取函数 com company js ComponentA prototyp