2016-09-26 1 views
1

私が使用しているライブラリ(DataTables)は、すべてのカスタマイズされたオプションで宣言されたオブジェクトを受け入れます。

ライブラリが$.extend({}, defaults , confs)のような結果設定を作成してユーザー定義オブジェクトを受け取ろうとすると、コードが失敗します。残念ながらconfsで定義されたすべての方法は$.extend

の結果でこのコードが欠落している は、私は何をしようとしています説明:

class BaseConf { 
    constructor() { 
     this.ordering = false; 
    } 
    initComplete() { 
     console.log('BaseConf.foo executed'); 
    } 
} 

class ExtendedConf extends BaseConf { 
    initComplete() { 
     super.foo(); 
     console.log('ExtendedConf.foo executed'); 
    } 
} 

conf = new ExtendedConf(); 


mergedConf = $.extend({}, conf); 

console.log(mergedConf.ordering);  // <-- print false 
console.log(mergedConf.initComplete); // <-- print undefined 

これが起こるとそれを修正する方法にはいくつかの提案理由の任意のアイデアを?

答えて

2

$.extendの最終結果は、対象オブジェクト{}へのオブジェクトconfのシャローコピーです。

ただし、は、対象オブジェクトのプロトタイプを変更しません。したがって、インスタンスプロパティがconfから{}にコピーされている間に、{}ExtendedConfまたはBaseConfのインスタンスにならないため、initCompleteメソッドを実行しません。あなたは何ができるか

は、あなたがそのプロトタイプExtendedConfのプロトタイプであるオブジェクトを作成するためにObject.createを使用することができ、だけではなく{}です。こうして、結果のオブジェクトはExtendedConfを継承します。その後、jQueryの$.extendを使用してインスタンスのプロパティをコピーします。

var conf = $.extend(Object.create(ExtendedConf.prototype), conf); 
+0

私はなぜコードが失敗するのか理解していますので、唯一の解決策は、$ .extendの使用を避けるためにライブラリ内のコードを変更することです。 –

+0

@CarloVallergaが答えを更新しました。 – Joseph

関連する問題