javascript - 局部作用域函数原型(prototype)覆盖

标签 javascript

向所有函数添加原型(prototype)很简单:

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

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

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

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

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

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

不幸的是,这也会影响 Function 的原型(prototype),因为 Function 的作用域是通过引用确定的。

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

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

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


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

鉴于这些示例,是否真的不可能在不影响我范围之外的所有其他函数的情况下扩展所选函数的原型(prototype)?

最佳答案

使用 new 关键字为您的自定义函数创建原型(prototype)。

这样,原来的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

关于javascript - 局部作用域函数原型(prototype)覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19622672/

相关文章:

javascript - 检测元素是否应用了 CSS 动画的最佳方法是什么

javascript - 使用 Javascript API 在运行时编辑 ARCGIS 属性

javascript - 在javascript中重命名json的每个键

javascript - 在 IE 11 中工作但无法在 Google Chrome 中工作 - 使用 jquery 下载 Excel 文件

javascript - Ember.js RESTAdapter 需要 PUT 来响应 JSON

javascript - Bootstrap 响应式 iframe,具有自动高度计算

javascript - 在 JavaScript 中组合对象数组以形成一个新的数组

javascript - ClientScript.RegisterStartupScript 不工作

javascript - Jquery 使新插入的 div 可拖动

javascript - 如何使用 Javascript 显示图表