Li Ming

如何复制一个 JavaScript 函数?

今天同事说起去百度面试的经历,聊到关于深拷贝的事情,面试官问道 JSON 里有 function 怎么办呢?

只知道 function 也是引用类型,但压根没考虑过要复制一个函数这种鬼东西,后来在 StackOverflow 找到了这段代码:

var x = function() {
    return 1;
};

var t = function(a,b,c) {
    return a+b+c;
};


Function.prototype.clone = function() {
    var that = this;
    var temp = function temporary() { return that.apply(this, arguments); };
    for(var key in this) {
        if (this.hasOwnProperty(key)) {
            temp[key] = this[key];
        }
    }
    return temp;
};

alert(x === x.clone());
alert(x() === x.clone()());

alert(t === t.clone());
alert(t(1,1,1) === t.clone()(1,1,1));
alert(t.clone()(1,1,1));

还有个增强版:

Function.prototype.clone = function() {
    var cloneObj = this;
    if(this.__isClone) {
      cloneObj = this.__clonedFrom;
    }

    var temp = function() { return cloneObj.apply(this, arguments); };
    for(var key in this) {
        temp[key] = this[key];
    }

    temp.__isClone = true;
    temp.__clonedFrom = cloneObj;

    return temp;
};

看了以后受益颇多,在此记录下来。

后记:有同事考虑将某个函数 toString(),然后通过 eval() 赋值给另一个变量,虽然也可以,不过 prototype 上的东西就没了。

参考资料

http://stackoverflow.com/questions/1833588/javascript-clone-a-function