2017-04-03 12 views
0

モジュールにES6クラスを実装しているjavascriptライブラリを使用しています。私はjavascriptで古典的な継承を使用しておらず、基本的にクラスの実装を元に戻したいと考えています。私がそれらのクラスを受け取り、それをFactory/Compositionアプローチで使用する方法はありますか? JSプロトタイプの継承とオブジェクトの簡単な堆肥化を利用したいと思っています。以下は私がこれまで持っているものの例です。最終的に私はJavaScriptでそれを使用することに慣れていないので、classとnewの使用を避けようとしています。私が正しい方法でこれに近づいているのか、私が時間を無駄にしているのか、誰にでも教えてもらえますか、ありがとう。あなたはむしろnewに慣れる必要がありますクラスを使用する代わりにファクトリ関数を作成する方法

class Example { 

constructor(id) { 
    this.id = id; 
} 

getID() { 
    console.log(this.id); 
} 
} 


function convertClassToObject(theClass) { 
var x = new theClass(); 
var newX = Object.create(x); 
return newX; 
} 

var NewPrototype = convertClassToObject(Example); 

function NewFactory(options) { 
var x = Object.assign(Object.create(NewPrototype), options); 
return x; 
} 

var NewInstance = NewFactory({id: 123456789}); 
+3

'class'はコンストラクタとプロトタイプの構造の周りだけ糖衣構文です。すべてがまだ原型ベースの下にあります。 'new Example(id)'は 'var obj = Object.create(Example.prototype);と同じです。 obj.constructor(id) 'です。 –

+0

ああ、私はObject.createでプロトタイプをリンクし、そのインスタンスをファクトリに使用するだけでいいです。 – jhamPac

+2

@MikeCコンストラクター*が 'new'(または' super() 'や' Reflect.construct')で呼び出されなければならないES6を除いて – Bergi

答えて

2

、それは工場でプロトタイプ継承を行うよりもはるかに簡単です。もちろん

、それは工場出荷時の機能にコンストラクタ関数を変換するために些細です:

function classToFactory(constr) { 
    return (...args) => new constr(...args); 
} 

const makeExample = classToFactory(Example); 
const newInstance = makeExample(123456789); // no `new` any more 
+0

私は新しいキーワードに慣れ親しんでいるようです。あなたの洞察に感謝します。 – jhamPac

関連する問題