将$ .extend与用户定义的对象一起使用

时间:2016-09-26 14:03:27

标签: javascript jquery datatables ecmascript-6

我使用的图书馆(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

知道为什么会发生这种情况以及如何修复它的一些建议?

1 个答案:

答案 0 :(得分:2)

$.extend的最终结果是对象conf到目标对象{}的浅表副本。

但是,它不会改变目标对象的原型。因此,当实例属性从conf复制到{}时,{}不会成为ExtendedConfBaseConf的实例,因此不会initComplete方法。

您可以做的不仅仅是{},而是可以使用Object.create来创建原型为ExtendedConf原型的对象。这样,生成的对象继承ExtendedConf。之后,使用jQuery&#39; $.extend复制实例属性。

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