首先,我不想在Function.prototype
. 这样做会使它们可用于所有功能,这不是我想要的。
在 JavaScript 中,您可以创建具有自定义原型的对象,如下所示:
function CustomObj() {}
CustomObj.prototype = {};
CustomObj.prototype.sayFoo = function () { return 'foo' };
var myCustomObj = new CustomObj(); //=> returns an object: {}
myCusomObj.sayFoo(); //=> 'foo'
您还可以使用自定义原型创建类似数组的对象,如下所示:
function CustomArr() {}
CustomArr.prototype = [];
CustomObj.prototype.sayFoo = function () { return 'foo' };
var myCustomArr = new CustomArr(); //=> returns an ordered object: []
myCustomArr.sayFoo(); //=> 'foo'
我想做的是使用某种构造函数以同样的方式创建一个具有自己自定义原型的函数。但是,以下方法不起作用:
function CustomFn() {}
CustomFn.prototype = function () {};
CustomFn.prototype.sayFoo = function () { return 'foo' };
var myCustomFn = new CustomFn(); //=> PROBLEM! returns an object: {}
myCustomFn.sayFoo(); //=> 'foo'
// ^^ Here, the prototype was applied but the output was not a function.
myCustomFn(); //=> TypeError: object is not a function
那么有什么方法可以完成我想要做的事情吗?
更新
也许我可以用另一种方式来问这个问题,这会让它更清楚一点。
闭包的想法有问题:
function makeFn() {
var output = function () { /* do some stuff */ };
output.foo = function () { /* do some stuff */ };
return output;
}
var specialFn = makeFn();
从本质上讲,这种技术给了我想要的东西。但是,问题是每次我调用makeFn
,output.foo
都必须创建为一个完全独立的函数,占用自己的内存。总的。所以我可以将该方法移出闭包:
var protoMethods = {
"foo" : function () { /* do some stuff */ }
};
function makeFn() {
var output = function () { /* do some stuff */ };
for (var i in protoMethods) {
Object.prototype.hasOwnProperty.call(protoMethods, i) &&
(output[i] = protoMethods[i]);
}
return output;
}
var specialFn = makeFn();
但是现在我每次调用时都必须手动进行迭代makeFn
,这比我可以分配protoMethods
为output
. 那么,有了这个新的更新,有什么想法吗?