向所有函数
添加原型(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/