Можете ли вы создавать функции с пользовательскими прототипами в 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();

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

Ответы на вопрос(3)

Ваш ответ на вопрос