1

将原型添加到所有Functions 是微不足道的:

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

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

假设我希望我的所有函数都有方法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'; }

鉴于这些示例,是否不可能扩展选定函数的原型而不影响我范围之外的所有其他函数?

4

2 回答 2

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
于 2013-10-28T18:24:19.557 回答
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))
于 2013-10-27T20:07:51.563 回答