栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么instanceof在babel-node下的Error子类的实例上不起作用?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么instanceof在babel-node下的Error子类的实例上不起作用?

tl; dr如果您使用的是Babel 6,则可以使用https://www.npmjs.com/package/babel-plugin-
transform-b​​uiltin-extend

Babel从未支持扩展诸如

Array
and
Error
等这样的内置类型。它在真实的ES6环境中完全有效,但是存在使其难以与旧版浏览器兼容的方式进行转换的要求。它在Babel
5中“起作用”是因为它没有引发错误,但是从扩展子类实例化的对象却无法像预期的那样起作用,例如:

class MyError extends Error {}var e1 = new MyError();var e2 = new Error();console.log('e1', 'stack' in e1);console.log('e2', 'stack' in e2);

结果是

e1 falsee2 true

虽然没有出错,但子类却无法正确获得“堆栈”,就像应该错误一样。类似地,如果要扩展,

Array
它的行为可能有点像数组,并且具有数组方法,但它的行为却并不完全像数组。

Babel 5文档专门将其称为需要注意的类的边缘情况。

在Babel 6中,对类进行了更改,使其在处理子类时更加符合规范,其副作用是现在上面的代码 仍然
无法工作,但是将无法以不同于以往的方式工作。这已在https://phabricator.babeljs.io/T3083中进行了介绍,但在此我将详细介绍一个潜在的解决方案。

要返回Babel 5的子类化行为(记住,仍然不正确或不建议这样做),您可以将内置的构造函数包装在自己的临时类中,例如

function ExtendableBuiltin(cls){    function ExtendableBuiltin(){        cls.apply(this, arguments);    }    ExtendableBuiltin.prototype = Object.create(cls.prototype);    Object.setPrototypeOf(ExtendableBuiltin, cls);    return ExtendableBuiltin;}

有了这个帮手,而不是做

class MyError extends Error {}

class MyError extends ExtendableBuiltin(Error) {}

但是,在您的特定情况下,您已经说过您在Node
5.x上。节点5支持本机ES6类,无需进行编译。我建议您通过删除

es2015
预设来使用它们,而改用来
node5
获得本机类,等等。在这种情况下,

class MyError extends Error {}

将以您期望的方式工作。

对于不是使用Node
4/5或仅使用最新Chrome的用户,您可能需要考虑使用https://www.npmjs.com/package/error之类的东西。您还可以浏览https://www.npmjs.com/package/babel-
plugin-transform-b​​uiltin-extend。在

approximate
从该选项是从巴贝尔相同的行为5.谨防非
approximate
行为肯定是边缘凯西,不得以的情况下100%的工作。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387482.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号