将构造函数传递给 Array.map?

2024-05-14

我怎样才能做这样的事情:

var a = [1,2,3,4];
a.map(Date.constructor);

此代码在 Google V8 上引发错误:

SyntaxError: Unexpected number

我也尝试过:

a.map(Date.constructor, Date.prototype)

得到相同的结果。


我认为OP正在寻找的内容与此严格类似:

var nums = [1, 2, 3];
var strs = nums.map(String);
//=> ['1', '2', '3']; // array of strings

我认为原因是这非常优雅,无论是在像上面这样的简单类型转换操作中,还是在更有趣的任务中,例如将某事物的一种表示形式转换为不同的表示形式,如下所示:

function MyCoolObject(oldObject) {
    // generates new object by consuming old one
    // maybe attach some cool class methods via prototype
    return this;
}

var newList = oldList.map(MyCoolObj);
//=> array of MyCoolObj based on oldObject

问题似乎是,当通过将构造函数传递给创建新对象时Array.map,是一个扩展版本window;那是,this构造函数内指的是全局范围,这很糟糕,因为 (1) 挂起 props 不是你的目标window,以及 (2) 您以这种方式创建的对象不是唯一的实例。

无论如何,最初的类型转换示例也并不像人们所吹捧的那样,因为:

strs[0] instanceof String
//=> false // UGH!

到目前为止,我提出的唯一解决方案需要以不同的方式编写构造函数——这显然不能用于本机类型,例如Date:

function Human(animal) {
    var h = new Object();
    h.species = 'human';
    h.name = animal.name;
    return h;
}

var humans = animals.map(Human);

通过将返回值定义为一个新对象,我们切断了全局范围和this;至少,我认为这就是这里发生的情况。 (您也可以返回 JSON 文字而不是调用Object.)

如果我希望这些对象有一个有趣的原型,我必须单独定义它,然后显式附加它:

// this object will be used as the prototype for new Human instances
var HumanProto = {
    species: 'human',
    speak: function() { console.log('My name is ' + this.name); },
    canDrink: function() { return this.age >= 21; }
}

// then, in Human, make this change
var h = new Object(HumanProto);

在这种情况下,返回 JSON 并不好,因为似乎没有任何有效的方法来设置对象文字的原型;即使你可以,你也永远不会想要this是真实的:

myObject.hasOwnProperty('prototype');
//=> true // only if myObject = { prototype: HumanProto }

我认为确保新对象具有所需原型的最佳方法是将潜在原型作为参数传递给new Object().

这种模式理想吗?我不知道。这看起来有点奇怪,因为现在有两个与创造人类相关的符号:Human构造函数,以及HumanProto显式原型。更重要的是,如果您已经拥有一个有趣的自定义类生态系统,而这些自定义类的编写方式并非与此模式兼容,那么这似乎是一个真正的障碍。

也许有更好的出路。也许有人会发布它。

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

将构造函数传递给 Array.map? 的相关文章

随机推荐

  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • 如何检测 iOS 8 上的包含应用程序是否启用了应用程序扩展?

    我正在 iOS 8 beta 上开发一个自定义键盘 我想告诉用户如果我的自定义键盘未启用 如何在包含应用程序中启用它 有什么方法可以检测应用程序扩展是否已启用 首先让我们设置一些常量 以便于彼此理解 包含应用程序 安装扩展并保存扩展二进制文
  • 让 WSO2 IOT 服务器作为 Windows 服务运行

    我在Server 2012R2上安装了WSO2 IOT Server 我安装了 YAJSW 包装器并按照 WSO2 说明进行配置 当我启动 runConsole bat 来配置 Windows 服务时 出现以下错误 我设置了 JAVA HO
  • 基于类的通用视图额外的上下文

    在基于类的视图之前 有一个可以在 urlsconf 中传递的 extra context 关键字 https docs djangoproject com en 1 3 topics generic views adding extra c
  • WPF:当 FontStyle 为 Oblique 时,剪切文本块中最后一个字母的部分

    我有一个简单的 XAML 示例
  • 混合混合模式:乘法在 Chrome 中不起作用

    我正在尝试使用mix blend mode multiply在 Chrome 上 但它无法按预期工作 当我添加时magenta cyan and yellow在一起它不会给我黑色但brown https i stack imgur com
  • 从 Bootstrap 4 网格中删除装订线

    在 Bootstrap 4 中 我被要求自定义桌面的默认网格系统 如下所示 其中 容器 桌面断点为1280px 我尝试过的例子是 body margin top 3rem l wrap max width 1280px margin rig
  • 在这种情况下垃圾收集器会做什么? [复制]

    这个问题在这里已经有答案了 我试图了解 GC 将如何行动的两种情况 1 有两个对象 object1 和 object2 object1 引用了 object2 object2 引用了 object1 现在 这两个对象都没有被使用 GC 可以
  • 获取所有矩阵列逐元素乘积对的快速方法

    假设我有一个数字matrix set seed 1 mat lt matrix rnorm 1000 ncol 100 我想生成所有向量 它们是中所有唯一向量对的逐元素乘积的结果mat 我们如何改进下面的代码 all pairs lt t
  • RSA 私有指数确定

    我的问题是关于 RSA 签名 如果是 RSA 签名 加密 gt y x d mod n 解密 gt x y e mod n x gt 原始消息 y gt 加密消息 n gt 模数 1024 位 e gt 公共指数 d gt 私有指数 我知道
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 如何使用 AWS Glue 开始处理从 Web 服务终端节点提取的数据?

    更多源数据来自我需要定期轮询的 Web 服务端点 获得数据后 我可以使用 pyspark 执行传统的 ETL 并最终将数据写入 S3 和 Redshift 我不确定如何进行初始提取 甚至不确定我应该在 AWS Glue 文档中查找什么内容
  • 对象集合表单的 Freemarker 语法 (Spring 3 MVC)

    我有一个命令 bean FooList 它有一个属性 它是一个集合 aList of Foo beans 我正在尝试创建一个可以编辑所有内容的表单Foo立刻 我发现了许多如何使用 JSP 执行此操作的示例 但我在将这些示例转换为 Freem
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 每个进程每个线程的时间量

    我有一个关于 Windows 和 Linux 中进程和线程的时间量子的问题 我知道操作系统通常为每个线程提供固定的时间量 我知道时间量根据前台或后台线程而变化 也可能根据进程的优先级而变化 每个进程有固定的时间量吗 例如 如果操作系统为每个
  • 在非持久字段更改上保留实体

    我有一个具有 plainPassword 和密码属性的实体 在表单中 我映射到 plainPassword 之后 当用户验证表单时 我对 plainPassword 进行密码验证 为了对密码进行编码 我使用了监听 prePersist 和
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • ZipArchives 存储绝对路径

    我可以使用相对路径压缩文件吗 例如 zip gt addFile c wamp www foo file txt ZIP 应该具有如下目录结构 foo gt file txt and not wamp gt www gt foo gt fi
  • 将构造函数传递给 Array.map?

    我怎样才能做这样的事情 var a 1 2 3 4 a map Date constructor 此代码在 Google V8 上引发错误 SyntaxError Unexpected number 我也尝试过 a map Date con