2016-07-12 6 views
0

あるオブジェクトから別のオブジェクトに関数をコピーしています。問題は、彼らがソースオブジェクトに匿名であるが、彼らはターゲットオブジェクトに名前を持っていることです。関数の匿名化/オブジェクト内の名前の削除

var o1 = { 
 
    a: function() { 
 
    alert("Hello World"); 
 
    }, 
 
    b: 123, 
 
    c: "Some string" 
 
} 
 

 
var o2 = {}; 
 

 
for (var key in o1) { 
 
    if ("function" == typeof o1[key]) { 
 
    o2[key] = o1[key]; 
 
    } 
 
} 
 

 
console.log(o2.a); //output: function o1.a()

2つの関数は、いくつかの方法で接続しているように見えるが、これはありません少なくとも刺激的です。また、Firefox Developer Editionは、コンソールにログインして名前をクリックすると、その機能がどこから来たのかを知ることができます。それに何らかの悪影響が及ぶかどうかは分かりません。

したがって、関数をコピーして匿名にすることができれば、それは素晴らしいことです!

+0

これは、関数の内部でさらに行きます。さて、上記のコードを関数 'foo'の中にラップすると、コンソール出力は' function foo/o1.a() 'になります。 – jaySon

+1

ChromeとFirefoxでテストしました。どちらのバージョンでも、別のオブジェクトに入れたときに名前を関数に追加していません。そして、それはあなたがそれをコピーしていないのでソース関数がどこにあったかを常に知るでしょう、あなたは参照を作成しています。それにかかわらず、なぜあなたはそれを匿名にしていますか? –

+0

copy by reference ... – epascarello

答えて

1

Object.assign()を使用できます。

var o1 = { 
    a: function() { 
    alert("Hello World"); 
    }, 
    b: 123, 
    c: "Some string" 
} 

var o2 = Object.assign({}, o1); 

独立オブジェクトを操作します。

もこれを見て: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

+0

あなたは本当にコピーしているわけではありません。参照をコピーするだけです。これを行うと、 'o1.a === o2.a'となります。彼はおそらくFunction.bind(o2)を使用する必要があります。 –

+0

これは、オブジェクトを(for-in-loopの代替として)コピーする適切な方法ですが、結果は同じです。 – jaySon

関連する問題