1. ホーム
  2. javascript

[解決済み] JavaScriptです。オブジェクトを値で渡すには?

2023-02-16 02:07:50

質問

  • オブジェクトをパラメータとして渡すとき、JavaScriptは参照で渡すため、オブジェクトのローカルコピーを作成することが困難です。

    var o = {};
    (function(x){
        var obj = x;
        obj.foo = 'foo';
        obj.bar = 'bar';
    })(o)
    
    

    o を持つことになります。 .foo そして .bar .

  • クローンによって回避することが可能です。簡単な例です。

    var o = {};
    
    function Clone(x) {
       for(p in x)
       this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p];
    }
    
    (function(x){
        var obj = new Clone(x);
        obj.foo = 'foo';
        obj.bar = 'bar';
    })(o)
    
    

    o を持つことはありません。 .foo または .bar .


質問

  1. オブジェクトを値で渡すには、ローカル コピー/クローンを作成する以外に良い方法はありますか。

どのように解決するのですか?

そうでもないです。

実際に必要なものにもよりますが、1つの 可能性 を設定することができます。 o を新しいオブジェクトのプロトタイプとして設定することができます。

var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

に追加したプロパティは obj には追加されません。 o . に追加されたプロパティは obj のプロパティと同じ名前を持つ o はシャドウされます。 o プロパティになります。

もちろん、どのプロパティも o に追加されたプロパティは obj を持つすべてのオブジェクトは、影がかかっていなければ o を持つすべてのオブジェクトは、プロトタイプチェーン内の o .

また、もし obj に配列のような別のオブジェクトを参照するプロパティがある場合、 オブジェクトにメンバーを追加する前に必ずそのオブジェクトをシャドウする必要があります。 obj に追加され、そのオブジェクトは obj を持つすべてのオブジェクトで共有されます。

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // 'new_value'

でArrayをシャドウしていないため、このようになります。 baz にある obaz プロパティに obj を使用すると o.baz 配列は修正される。

だからその代わりに、まずシャドウする必要があるんだ。

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz = [];
    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // undefined