我使用的图书馆(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
知道为什么会发生这种情况以及如何修复它的一些建议?
答案 0 :(得分:2)
$.extend
的最终结果是对象conf
到目标对象{}
的浅表副本。
但是,它不会改变目标对象的原型。因此,当实例属性从conf
复制到{}
时,{}
不会成为ExtendedConf
或BaseConf
的实例,因此不会initComplete
方法。
您可以做的不仅仅是{}
,而是可以使用Object.create
来创建原型为ExtendedConf
原型的对象。这样,生成的对象继承ExtendedConf
。之后,使用jQuery&#39; $.extend
复制实例属性。
var conf = $.extend(Object.create(ExtendedConf.prototype), conf);