本地范围函数原型覆盖

时间:2013-10-27 19:48:27

标签: javascript

向所有Function s:

添加原型是微不足道的
Function.prototype.foo = function () { return 'bar'; };
(new Function).foo();  // 'bar'

然而,由于跨模块对象依赖问题,将事物分配给全局对象的原型也是不好的做法,部分导致早期版本的 prototype.js 的消亡。

假设我希望所有 my 函数都使用方法foo。我会做类似的事情:

(function () {
    var Fn = Function;
    Fn.prototype.foo = function () { return 'bar'; };

    (new Fn).foo();  // 'bar'
}());

(new Function).foo()  // also 'bar'. this is bad!

不幸的是,这也影响了Function的原型,因为Function是通过引用确定的。

将原始值传递给IIFE的通常的“复制值”方法也会失败,因为Function本身就是一个对象。

(function (Fn) {
    Fn.prototype.foo = function () { return 'bar'; };

    (new Fn).foo();  // 'bar'
}(Function));


Function.foo  // function () { return 'bar'; }

鉴于这些例子,是否真的无法扩展选定的函数原型,而不会影响我范围之外的所有其他函数?

2 个答案:

答案 0 :(得分:1)

使用new关键字为自定义函数创建原型。

这样,原始Function.prototype不会改变:

(function (BaseFunction) {  
   var CustomFunction = function () { };
   CustomFunction.prototype = new BaseFunction();
   CustomFunction.prototype.foo = function () { return 'bar'; };
   console.log((new CustomFunction()).foo()); // 'bar'
})(Function);
console.log((new Function).foo); //undefined

答案 1 :(得分:0)

据我所知,这是不可能的。您可以尝试这样的事情,一次设置更多原型(小提琴:http://jsfiddle.net/ZgM8A/):

var ns = {};

(function(ns){
    var local = {};

    local.func1 = function() {
        this.p = "func1";
    }

    local.func2 = function() {
        this.p = "func2";
    }

    var proto = {
        name : "test"
    }

    for (var prop in local){
        if (local.hasOwnProperty(prop) && typeof local[prop] === "function"){
            local[prop].prototype = proto
        }
    }

    console.log(new local.func1());
    console.log(new local.func2());

}(ns))