2017-04-14 13 views
0

私はその引数と同じオブジェクトを返すユーティリティ関数を書こうとしました。クラス名 `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:機能は、地図などES6コレクション型を除き、ほとんどのクラスのために正常に動作します。

+0

'evalの(「VAR OBJ =新しいです"+ className);' –

+0

@RyanMcCullaghいいえ。すべてのクラスに名前(アクセス可能)があるわけではなく、スコープ内にないか、一意ではないかもしれません。 – Bergi

答えて

4

...検出:

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

ああ、同じことを投稿しましたが後で投稿しました。私はこれがこれを行う唯一の合理的な方法だと信じています。 – estus

+1

または、ラッパーを完全にスキップし、 'new obj.constructor();'を直接呼び出してください。私はそれがあなたがこれを行う必要がある頻度に依存すると思います。 –

+0

ありがとう@Derek、それは魅力のように動作します。你真的 "會功夫"。 – Smartkid

0
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

関連する問題