向所有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'; }
鉴于这些例子,是否真的无法扩展选定的函数原型,而不会影响我范围之外的所有其他函数?
答案 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))