【问题标题】:Local scope Function prototype override局部范围函数原型覆盖
【发布时间】:2013-10-27 19:48:26
【问题描述】:

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

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

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

假设我希望所有 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'; }

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

【问题讨论】:

标签: javascript


【解决方案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

【讨论】:

  • BaseFunction 是干什么用的?
  • @RocketHazmat 错字,它是对原始Function 的引用。
  • 很遗憾,这行不通。您的 CustomFunction 对象不能作为函数调用。
【解决方案2】:

据我所知,这是不可能的。您可以尝试这样的事情,一次设置更多原型(小提琴: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-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多