是否可以创建一个没有硬编码类名“Map”的地图?

问题描述:

我试着编写一个实用函数,它返回一个与它的参数相同的对象。此功能工作正常的大多数类,除了ES6集合类型,如地图:是否可以创建一个没有硬编码类名“Map”的地图?

function createInstanceOfSameClass(arg) { 
    return Object.create(Object.getPrototypeOf(arg)); 
} 

const m1 = new Map(); 
const m2 = createInstanceOfSameClass(m1); 
m2.set(1, "x"); // Uncaught TypeError: Method Map.prototype.set called on incompatible receiver #<Map> 

The jsfiddle is here

+0

'的eval(“VAR OBJ =新“+ className);' –

+0

@RyanMcCullagh不,不是所有的类都有一个名字(你可以访问),它们可能不在范围内,甚至不是唯一的。 – Bergi

嗯...你可以构造这样:

function create(obj){ 
    return new obj.constructor(); 
} 
+2

哈,我发布了同样的东西,但后来。我相信这是做到这一点唯一合理的方式。 – estus

+1

或者,完全跳过包装,直接调用'new obj.constructor();'。我想这取决于你需要这么做的频率。 –

+0

谢谢@Derek,它的功能就像一个魅力。你真的 “会功夫”。 – Smartkid

function createInstanceOfSameClass(arg) { 
    if(arg.has){ 
    return new Map(); 
    } 
    if(Array.isArray(arg)){ 
    return []; 
    } 
    return Object.create(Object.getPrototypeOf(arg)); 
} 

简单地检测如果地图/阵列... http://jsbin.com/yimatuquce/edit?console

+0

如果它是'Set'会怎么样? – Bergi