具体化呼吁;新类型();在JavaScript中

具体化呼吁;新类型();在JavaScript中,javascript,Javascript,JavaScript中是否有语法/API/惯用语来获取实例化任何类型的函数 也就是说,将对new Type(…args)的调用替换为,例如,(pseudocode)Type.new(…args),以便我可以将函数对象作为参数传递 我曾尝试单独使用const newTypeAsFn=new Type(不带括号),但它仍然会导致构造函数调用,而不是返回可以作为参数传递并稍后调用的函数对象 这是我希望能够做到的一个例子: const newStringAsFn = String.new; [1, 2,

JavaScript中是否有语法/API/惯用语来获取实例化任何类型的函数

也就是说,将对
new Type(…args)
的调用替换为,例如,(pseudocode)
Type.new(…args)
,以便我可以将函数对象作为参数传递

我曾尝试单独使用
const newTypeAsFn=new Type
(不带括号),但它仍然会导致构造函数调用,而不是返回可以作为参数传递并稍后调用的函数对象

这是我希望能够做到的一个例子:

const newStringAsFn = String.new;
[1, 2, 3].map(newStringAsFn);
// [String {"1"}, String {"2"}, String {"3"}]
我提出了一个函数,它可以:

const newAsFn = (type) => (...args) => new type(...args);
可以这样使用:

const newStringAsFn = newAsFn(String);
[1, 2, 3].map(newStringAsFn);
let strings = [1, 2, 3].map(newAsFn(String, 1));

let newArray = newAsFn(Array, Infinity);
let arr1 = newArray(1, 2, 3, 4, 5),
    arr2 = newArray("Hello", "world", "!");

有没有一种方法不使用我编写的这个函数(可能有bug)就可以做到这一点?会议?流行的库方法?

我认为正确的方法是使用您的
newAsFn
。为了更安全,您可以使用一些高阶函数和闭包:

let newAsFn = (type, numberOfArgs) =>
    (...args) => new type(...args.slice(0, numberOfArgs));
这样您就可以控制创建时要传递给构造函数的参数数量。用法如下所示:

const newStringAsFn = newAsFn(String);
[1, 2, 3].map(newStringAsFn);
let strings = [1, 2, 3].map(newAsFn(String, 1));

let newArray = newAsFn(Array, Infinity);
let arr1 = newArray(1, 2, 3, 4, 5),
    arr2 = newArray("Hello", "world", "!");

使用所有常见的警告,您可以使用getter属性扩展
Function.prototype
,以提供您想要的语法

//您的“新”getter
Object.defineProperty(Function.prototype,“新建”{
get:function(){
return(…args)=>newthis(…args)
}
})
//就像你表现出来的那样。它返回一个调用`新字符串'的函数`
const newStringAsFn=String.new;
const res=[1,2,3].map(newStringAsFn);

控制台日志(res)
@ASDFGerte对用户定义的类不起作用,例如:使用
类Foo{}
尝试该操作将创建一个类型错误。@ASDFGerte但您必须使用它。而且
字符串(1)
新字符串(1)
不同。。。你为什么需要这个?我根本想不出这个用例,所以知道是否真的有这样一个用例是非常有洞察力的。@ibrahimmahrir关于小心使用
map
。我不知道它向提供的函数传递了不止一个参数。是的,如果模式验证是原因,那么类似的东西就更有意义了。我想
Reflect.construct
几乎就是我想要的,只是我希望它是自动循环和可变的。你的解决方案很好,并且符合这个例子,所以我接受它。不过我不喜欢胡闹。我本来希望像
lodash
这样的库会有一个包装器,它能做
newAsFn
所做的事情,我只是碰巧不知道如何搜索它,但如果我的
newAsFn
没有问题,我想我会用它。是的,
反射。构造
不可变是有点令人失望。如果是,您可以执行
Reflect.construct.bind(null,String)
,尽管它有点长。你的功能很好。唯一的缺点是,如果您不小心用函数以外的东西调用它。