Czy możesz tworzyć funkcje z niestandardowymi prototypami w JavaScript?

Po pierwsze, janie chcesz dodać metody doFunction.prototype. Czyni to, że będą dostępne dlawszystko funkcje i to nie jest to, czego szukam.

W JavaScript możesz tworzyć obiekty z niestandardowymi prototypami w ten sposób:

function CustomObj() {}
CustomObj.prototype = {};
CustomObj.prototype.sayFoo = function () { return 'foo' };

var myCustomObj = new CustomObj(); //=> returns an object: {}
myCusomObj.sayFoo(); //=> 'foo'

Możesz także tworzyć obiekty podobne do tablic z takimi niestandardowymi prototypami:

function CustomArr() {}
CustomArr.prototype = [];
CustomObj.prototype.sayFoo = function () { return 'foo' };

var myCustomArr = new CustomArr(); //=> returns an ordered object: []
myCustomArr.sayFoo(); //=> 'foo'

Chciałbym użyć pewnego rodzaju konstruktora, aby utworzyć funkcję z własnym niestandardowym prototypem w ten sam sposób. Jednak poniższe nie działają:

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

Czy jest jakiś sposób na osiągnięcie tego, co próbuję zrobić?

AKTUALIZACJA

Może jest inny sposób, w jaki mógłbym zadać to pytanie, które uczyniłoby to trochę jaśniejszym.

Jest problem z pomysłem zamknięcia:

function makeFn() {
  var output = function () { /* do some stuff */ };
  output.foo = function () { /* do some stuff */ };
  return output;
}
var specialFn = makeFn();

Zasadniczo ta technika daje mi to, czego chcę. Jednak problem polega na tym, że za każdym razem dzwonięmakeFn, output.foo musi być stworzona jako całkowicie niezależna funkcja, która zajmuje własną pamięć. Obrzydliwy. Więc mógłbym przenieść tę metodę z zamknięcia:

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();

Ale teraz muszę ręcznie wykonywać iterację za każdym razem, gdy dzwonięmakeFn co byłoby mniej wydajne, niż gdybym mógł po prostu przypisaćprotoMethods być prototypemoutput. Tak więc, dzięki tej nowej aktualizacji, wszelkie pomysły?

questionAnswers(3)

yourAnswerToTheQuestion