强插功能不去除静态属性(Overriding a function without removing

2019-09-23 07:33发布

如果我有这样的功能:

function a() {
    console.log('a');
}

然后分配这样的静态属性:

a.static = 'foo';

但说我要重写,像这样的另一功能的功能:

var old = a;

a = function() {
    console.log('new');
    old.call(this);
};

a.static // undefined

因为我分配了一个新的功能,以a ,它的静态属性都将丢失。 有一个整洁的方式来保持静态属性,而无需循环和手动复制?

更新:

这里有一个真实的场景:在引导jQuery插件,笔者分配默认为这样的属性功能:

$.fn.modal = function() {
    // some code
};

$.fn.modal.defaults = { // some object };

所以,如果我想“扩展”的原型我通常会做:

var old = $.fn.modal;

$.fn.modal = function() {
    // do my thing
    old.apply(this, arguments);
}

但是,这将使

$.fn.modal.defaults === undefined

这将打破功能,因为默认值都将丢失。 我想知道是否有在javascript偷偷摸摸改变功能不失静态属性。

Answer 1:

不,你不能做到这一点。 更换对象(功能)总是任何性质随它。

有两个解决方案在这里,都涉及从旧的对象转移属性,以新的。

第一个(推荐)的方法是复制的特性,它可以方便地完成$.extend

$.fn.plugin = $.extend(function() { ... }, $.fn.plugin);

第二个选择是将动态地设置新的函数的原型是老功能。 例如,在一些浏览器这会工作:

var f = function() { ... };
f.__proto__ = $.fn.plugin;
$.fn.plugin = f;

然而,这是不规范的,而且可能会引起并发症; 不这样做。



文章来源: Overriding a function without removing static properties