为什么 Map 不能在 chrome/node 中进行子类化?

2023-12-13

所以 ES 6 给我们带来了Maps(而且不会太快)。为了实现我自己的邪恶目的,我希望对 Map 进行子类化,我尝试了以下操作(为了清楚起见,进行了缩写):

function Foo() {
    return Map.apply(this, [].slice.call(arguments));
}

var bar = new Foo();

在 V8 环境中,这会引发错误“未使用‘new’调用映射构造函数”。为什么? SpiderMonkey 的理解是“正确的”:

Map.call({}, [['foo', 'bar']]).get('foo');

正如预期的那样,将产生“bar”。在 SpiderMonkey 和 V8 中都尝试类似的事情

function Foo() {};
Foo.prototype = new Map();
var bar = new Foo();
bar.set('foo', 'bar');

将失败:“在不兼容的对象上调用方法集”。所以继承模式就这样出现了。据我所知spec(我没有太多的spec-foo),实际的 Map 对象具有无法访问的内部属性,而这些属性是它们正常​​工作所需的。但为什么 V8 在第一个模式上抛出错误呢?这似乎是一个奇怪的决定,尤其是当它在 FF 中按预期工作时。

更新:我注意到 FF 和 chrome 都有Object.setPrototypeOf实施的。万一有人偶然发现这个并想到这一点,我可以告诉你它失败了。以下两项均因不同原因而失败:

//this totally fails, even for custom constructors/objects
var Foo = function(){};
Object.setPrototypeOf(Foo, Map.prototype);
var bar = new Foo(); //bar doesn't have any of the Map properties/methods

//this one has the methods but still throws the 'incompatible object'
//err. Also fails with new Map() instead of Map.prototype
var bar = Object.setPrototypeOf({}, Map.prototype); 

TL;DR

扩展地图基本上有四种方法(一些来自下面的答案/评论):

  1. 向 Map.prototype 添加方法(你真丢脸)。
  2. 工厂/构造函数使用您委托的内部 Map 实例创建对象
  3. Mixin fn 将属性复制到 Maps 上:
function Foo(){this.bar = 'boo!'}
var baz = new Map();
Foo.call(baz);
baz.bar; //yields 'boo!'
baz.set('5', 5).get('5'); //yields 5

或者只是等待您关心的 ES6 类登陆平台)


在 V8 环境中,这会引发错误“未使用‘new’调用映射构造函数”。为什么?

因为新的 ES6 类(包括内置类)应该只能用new.

SpiderMonkey 的做法“正确”

不完全是。The spec明确地说

Map不打算作为函数调用,并且以这种方式调用时会抛出异常。

希望对 Map 进行子类化

是的,这是适当的事情:

The Map构造函数被设计为可子类化。它可以用作一个值extends的条款class定义。打算继承指定的子类构造函数Map行为必须包括super调用 Map 构造函数来创建并初始化子类实例,并使用支持所需的内部状态Map.prototype内置方法。

所以你会想使用

class Foo extends Map {
    // default constructor
}
var bar = new Foo();
bar.set('foo', 'bar');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Map 不能在 chrome/node 中进行子类化? 的相关文章

  • Tampermonkey 的 GM_xmlhttpRequest 未实现“上下文”属性?

    我已经为 Greasemonkey Firefox 编写了一个用户脚本 并正在测试它与 Chrome 的 Tampermonkey 的兼容性 并在开发人员控制台中收到错误 Uncaught TypeError Cannot read pro
  • Angular 在 Img 末尾添加额外变量 %E2%80%8B

    http myimage png E2 80 8B 我刚刚复制粘贴了这个图像网址 但它最后添加了一些奇怪的数据 并且图像没有显示 但在代码上它看起来很完美 我尝试过类似 Angular 的东西 var imageSafeUrl this s
  • 范围滑块 javascript 以小时和分钟为单位

    我试图分别以小时和分钟为单位显示滑块的值 我对 JS 还很陌生 并且仍在尝试了解它是如何工作的 到目前为止 我所拥有的是一个工作滑块 其最大值为 1440 24 小时内的分钟 在 JS 中 我尝试将其划分为小时和分钟 并使用 innerHt
  • 如何对页面的某个部分进行实时更新?

    我需要刷新页面的各个部分 以便在有新数据时进行更新 我该怎么办 使用jquery 例子 是的 jQuery 非常适合这个 查看这些方法 http api jquery com category ajax http api jquery co
  • EXT JS中有全局变量吗

    在 java 和 C 中 我们可以全局存储变量并从项目中的任何位置访问它的值 比如说 我在一个名为Residence我正在保存residenceNumber这是一个INT到一个名为的全局变量houseNumberGlobalVariable
  • 切换 Ag-Grid 中的浮动过滤器?

    我试图通过开关或按钮单击来确定浮动过滤器的显示 看起来很简单 我应该能够在 true 和 false 之间切换 将该值提供给网格选项中的浮动过滤器 然后刷新标题 对吗 不幸的是 网格似乎总是落后一步 当我第一次点击时 什么也没有发生 当我将
  • 递归process.nextTick警告

    作为我的应用程序的一部分 我有以下代码行 process nextTick function pre populate cache with all users console log scanning users table in ord
  • 使用 javascript 和 jQuery UI datepicker 获取工作日数

    我有两个日期选择器 我可以从中计算天数 而无需计算星期六和星期日 但我想在周五和周六这样做 我尝试过一些不同的方法但失败了 对我来说 处理不包括周六和周日的天数很容易 但处理周五和周六的天数则不然 以下是我的 javascript 代码 f
  • Google 闭包编译器使用 WebStorm

    我喜欢用谷歌闭包编译器 https developers google com closure compiler in WebStorm https www jetbrains com webstorm 我已经通过 npm 下载了它 npm
  • Angularjs 使用 ng-init 为 ng-model 赋值

    您好 我有以下问题 看起来很简单并且应该有效 但事实并非如此 在我的代码中我输入了
  • 如何在Javascript中保存zip文件的二进制数据?

    我从 AJAX 响应中收到以下响应 这是 zip 文件的响应 请让我知道如何在 Javascript 中保存此 filename zip ZIP 里面有 PDF 文件 我的代码是这样的 ajax url baseURLDownload se
  • Django 管理中的自定义依赖下拉菜单

    我有一个按阶段模型的项目外键 我很难在 Django 管理页面中创建依赖的下拉列表 我想当用户从该项目的 项目下拉 阶段选择一个项目时 在第二个下拉菜单中显示 实现这一目标的最佳方法是什么 如果下拉列表根据其父级的值来过滤项目 那就太好了
  • 链接index.html client.js 和 server.js

    我从 Node js 开始 我的第一个程序已经遇到了问题 下面是我正在使用的代码 索引 html
  • 多个模板槽的相同槽内容

    在vuejs中 有没有一种方法可以为多个插槽设置相同的内容 而无需复制粘贴 So this
  • Backbone.View:delegateEvents 未将事件重新绑定到子视图

    我已将这个问题分解为尽可能小的示例 即 它只是为了演示问题 不一定代表现实世界的场景 假设我有一个父视图 此处为 MainView 其中包含一个子视图 此处为 SubView 如果在任何时候我需要重新渲染父视图 从而重新渲染子视图 我就会丢
  • Firebase 停止监听 onAuthStateChanged

    从版本 3 0 0 开始 我很难删除身份验证状态更改侦听器 要根据文档启动侦听器 firebase auth onAuthStateChanged function user handle it 但是 我在文档中找不到任何涉及删除身份验证状
  • 使用预先存在的数据库创建 PhoneGap iOS 应用程序

    我最近开始开发一个使用 PhoneGap 版本 2 8 0 作为药物查找器的应用程序 过去 我创建了该工具的 Web 版本 它使用 jQuery Mobile 和 PHP 来访问远程 SQL 数据库 PhoneGap 似乎是一个很有吸引力的
  • 如何在从数据库异步加载中用占位符替换不存在的图像

    我有一个包含图像的数据库 我需要根据用户的请求即时加载这些图像 这些图像将作为包含 div 容器中的单独 s 的背景图像 类似于图像滚动条 该数据库当前是本地数据库 但这不是我的问题 问题是数据库可能没有我请求的所有图像 并且我可能会得到一
  • 使用 _.extend() 进行 JavaScript 继承

    有什么区别 Employee prototype Object create Person prototype and extend Employee prototype Person prototype 两者都给出相似的结果 输出 但下划
  • 将画布下载为 PNG 图像[重复]

    这个问题在这里已经有答案了 当我尝试将画布下载为 PNG 图像时 浏览器会在新页面中打开该图像 但不下载它 我的下载代码 btnScaricaEtichetta click function console log Download loc

随机推荐

  • 云上的丑陋渲染

    我正在尝试实现代码本教程 但比例要大得多 半径 100000 单位 我不知道大小是否重要 但在我的地球上渲染云有一个奇怪的渲染 正如教程中所做的那样 我使用两个球体和三个纹理 地球贴图 凹凸贴图 云 Here the result that
  • 在 Win32 中从字符串中解析日期

    我有一个包含日期的字符串 另一个包含第一个字符串的日期格式的字符串 我可以调用一个函数将该日期转换为类似 SYSTEMTIME 结构的函数吗 基本上 我想要相反的获取日期格式 它并不完全符合您所描述的功能 但我会首先使用COleDateTi
  • 通过动作脚本关闭网络摄像头的使用

    有没有办法 如何在动作脚本中关闭网络摄像头连接 我正在通过 Camera getCamera 打开流 问题是 释放网络摄像头实例后 我尝试了很多方法 网络摄像头上的光仍然是光束 在 macbook pro 上尝试过 您只需致电video a
  • 带刻面的堆叠条的反向填充顺序

    我不知道如何反转填充顺序 基本上 我试图让指南和填充匹配单词从正到负的内在顺序 指南和填充顺序从上到下应该是 比我预期的要好得多 填充在最顶部 图例的顶部 比我预期的要好一点 关于我的预期 比我想象的差一点 比我预期的要糟糕得多 填充在最底
  • 查看SQL Server数据库对象列表时如何识别系统对象?

    我试图列出服务器上所有数据库中的所有存储过程 但我似乎无法可靠地过滤掉系统对象 我正在使用 SELECT FROM sysobjects WHERE id gt 100 这似乎在除 MSDB 之外的每个数据库中都运行良好 MSDB 充满了大
  • 如何使用经典蓝牙代替 LE

    在参照丹尼斯 马修斯的回答如何在 iOS 上指定经典蓝牙而不是 LE 是否有不同的 api核心蓝牙框架 Joels 有一种非常清晰的方法可以在 iOS 上使用经典蓝牙 它具有外部附件框架 但是 除了经典蓝牙之外 它还包括直接硬件连接 您需要
  • 有效使用 UncaughtExceptionHandler

    我最近了解了 Java 1 5 的这个功能 并开发了一个示例代码来使用它 我的目标是当线程由于未捕获的异常而死亡时重新启动线程 public class ThreadManager public static void main Strin
  • 为什么标签小部件中的文本周围出现难看的大括号? - Tkinter

    我的标签小部件中的文本周围有大括号 输出是 Total tries 0 代替Total tries 0 这是我的代码的简短版本 class Cell def check self mem tries 1 mem update tries c
  • UISearchController更新搜索结果问题

    我的问题是我已经实施了UISearchController在 Swift 3 中 当我尝试过滤它时 它很容易过滤简单数组 但我的情况有点不同 我有一个数组 我从中获取所有数据SQLite database在类中 所以它是类的数组 manag
  • 断开各个对等点与 MCSession 的连接?

    如果我有一组已连接的对等点 假设有 3 个 a gt b a gt c a gt d 我只想断开对等点 c 的连接 我应该做什么 我看到对类似问题的一个答复指出 您只能断开 您自己 与会话的连接 这意味着在上述情况下 如果我这样做 mySe
  • 在 MATLAB GUIDE 中显示大型文本文件的最佳方式是什么?

    如何使用 MATLAB GUIDE 控件在 GUI 中显示文本文件的内容 文本文件可能很长或很宽 因此它应该能够具有垂直和水平滚动条 多行编辑框可能是显示文本的最佳选择 例子 read text file lines as cell arr
  • 函数可选参数DATE类型失败

    我有一个函数可以查找下周一的日期 当没有传递可选日期参数时 它将变为默认值零 我想我已经添加了注释来解释问题 Function NextMondayFromADateOrToday Optional StartDate As Date As
  • 如何沿矩阵轴执行滚动求和?

    给定矩阵X with T行和列k T 50 H 10 k 5 X np arange T reshape T 1 np ones T k 如何执行滚动累积和X沿着行轴有滞后H Xcum np zeros T H k for t in ran
  • 如果我不“删除”会发生什么? [复制]

    这个问题在这里已经有答案了 如果我在执行期间分配一些内存但从不调用会发生什么delete程序终止 操作系统会释放我分配的所有内存并且不会 浪费 任何内存吗 或者在计算机重新启动之前我会丢失一部分内存吗 显然 我知道良好的编码实践是确保删除不
  • XSLT:多次复制对象 xml,同时递增属性和值

    我有一个如下所示的 xml 我想复制 n 次 同时递增其元素之一和属性之一 XML 输入
  • XNA 处理按键组合

    我已经阅读了一些涉及此问题的文章 但是在尝试实施一些之后 总是遇到同样的问题 快速说明 这是家庭作业 我正在使用 XNA 为我的游戏设计课程重新创建 Super Smash Brothers N64 风格 现在我有两个问题密切相关 熟悉 S
  • Maven 依赖项在 WEB-INF/lib 中不可见

    我在使我的项目基于 Maven 时遇到了这个奇怪的问题 我创建了一个新的Maven在 Eclipse 中创建项目并启用动态 Web 方面 但在运行时现在它会抛出ClassNotFoundException因为 Maven 依赖项没有复制到W
  • 子查询上的 GROUP_CONCAT 的奇怪结果

    在子查询上使用 GROUP CONCAT 时 我有一个奇怪的行为 这是我的查询 SELECT name GROUP CONCAT DISTINCT id SEPARATOR AS id FROM SELECT APN AS name GRO
  • 如何转换为模板类型?

    在 gdb 中 如果你有一个指向某个东西的指针 你可以在打印它之前对其进行转换 例如 这有效 print int 0xDEADBEEF 但是 如何打印std vector
  • 为什么 Map 不能在 chrome/node 中进行子类化?

    所以 ES 6 给我们带来了Maps 而且不会太快 为了实现我自己的邪恶目的 我希望对 Map 进行子类化 我尝试了以下操作 为了清楚起见 进行了缩写 function Foo return Map apply this slice cal