Dav*_*ing 6 javascript static constructor function extend
如果我有这样的功能:
function a() {
console.log('a');
}
Run Code Online (Sandbox Code Playgroud)
然后分配一个这样的静态属性:
a.static = 'foo';
Run Code Online (Sandbox Code Playgroud)
但是说我想用另一个函数覆盖这个函数,如下所示:
var old = a;
a = function() {
console.log('new');
old.call(this);
};
a.static // undefined
Run Code Online (Sandbox Code Playgroud)
由于我分配了一个新函数a,它的静态属性会丢失.是否有一种简洁的方法来保持静态属性而不循环并手动复制它们?
更新:
这是一个真实世界的场景:在Bootstrap jQuery插件中,作者将默认值分配给属性函数,如下所示:
$.fn.modal = function() {
// some code
};
$.fn.modal.defaults = { // some object };
Run Code Online (Sandbox Code Playgroud)
因此,如果我想"扩展"我通常会做的原型:
var old = $.fn.modal;
$.fn.modal = function() {
// do my thing
old.apply(this, arguments);
}
Run Code Online (Sandbox Code Playgroud)
但那样会
$.fn.modal.defaults === undefined
Run Code Online (Sandbox Code Playgroud)
这将破坏功能,因为默认值会丢失.我想知道在javascript中是否有一种偷偷摸摸的方式来改变功能 而不会丢失静态属性.
不,你不能这样做。替换对象(函数)总是带有任何属性。
这里有两种解决方案,都涉及将属性从旧对象转移到新对象。
第一种(推荐)方法是复制属性,可以使用以下方法方便地完成此操作$.extend:
$.fn.plugin = $.extend(function() { ... }, $.fn.plugin);
Run Code Online (Sandbox Code Playgroud)
第二种选择是动态地将新函数的原型设置为旧函数。例如,在某些浏览器中这可以工作:
var f = function() { ... };
f.__proto__ = $.fn.plugin;
$.fn.plugin = f;
Run Code Online (Sandbox Code Playgroud)
然而,这是不标准的,可能会引起并发症;不要这样做。