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ć?
AKTUALIZACJAMoż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?