2017-06-09 16 views
1

オブジェクトを関数に配置し、元の値を持つ オブジェクトを返す方法を理解しようとしています。オブジェクトはその状態を保持する必要があります

それは私の "フレームワーク" からの一部です...簡略化した例ここで

var _objectToFunction = function (obj) { 
     var F = function() { } 
     F.prototype = obj 
     return F 
    } 

var myclass = { 
    a:"abc", 
    print: function(){ 
     console.log("i am a func") 
    }, 
    config: { 
     path: "c:/bla" 
    } 
} 

var fo = _objectToFunction(myclass) 
var of = new fo() 
of.config.path = "c:/ofpath" 
of.z = "zzz" 
of.a ="aaa" 
console.log(of) 

var fo2 = _objectToFunction(myclass) 
var of2 = new fo2() 
console.log(of2.z) 
console.log(of2.a) 
console.log(of2.config.path) 

にconsole.log(of2.config.path)から出力すべき "C:/ BLA"しかし、 "c:/ ofpath"です。

どうすればこのようにすることができますか?

+1

すべての 'config'をプロパティは、同じオブジェクトへの参照です。異なるインスタンスに対して異なる 'config'オブジェクトを使いたい場合は、それを複製する必要があります。 – PeterMader

+0

あなたの答えに感謝します。 Object.assign({}、obj)でクローンを作成しようとしましたが、同じ結果が出ません。 – pumi

+0

@pumiそれはあなたがまだ(今クローンされている)myclass.configをオーバーライドしているので、それぞれのインスタンスに対してこれを行う必要があります。 –

答えて

1

あなたは、コンストラクタ(インスタンスが作成されたときに、呼び出される関数)を追加することもできます。

var _objectToFunction = function (obj) { 
    var F = function (...values) { 
     if(this.constructor) this.constructor(...values); 
    } 
    F.prototype = obj 
    return F 
} 

ですから、各インスタンスの新しい設定オブジェクトを作成することができます。

var myclass = { 
constructor:function(addconf){ 
    this.config=Object.create(this.config); 
    if(addconf) Object.assign(this.config,addconf); 
}, 
a:"abc", 
print: function(){ 
    console.log("i am a func") 
}, 
config: { 
    path: "c:/bla" 
} 
} 

これは、必要に応じて動作します。

var parent=_objectToFunction(myclass); 
var instance=new parent({ path:"changed"}); 

または標準オブジェクトのfuncsと:

var instance=Object.create(myclass); 
instance.constructor({path:"changed"}); 
関連する問題