Можете ли вы создавать функции с пользовательскими прототипами в JavaScript?
Прежде всего, яне хочу добавить методы к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
, Итак, с этим новым обновлением, есть идеи?