2017-03-24 5 views
2

Ich bin ein Neuling zu nodejs. Ich schreibe eine Hilfsfunktion zum Erstellen von JSON mit einem Schema, ich versuche, Funktionen (meist Setter) hinzuzufügen, um Werte festzulegen. Das Folgende ist eine einfache Version davon.Hinzufügen von Funktionen dynamisch zu function.prototype

function Task() { 
    this.action = {}; 
    this.schedule = {}; 
} 

function capitalize(str) { 
    return `${str[0].toUpperCase()}${str.slice(1)}`; 
} 

const scheduleProps = [ 
'startAt', 
'repeatEvery', 
'endAt', 
'count', 
'interval' 
]; 

hinzufügen Methoden dynamisch

for(var i=0; i<scheduleProps.length; i++) { 
    Object.defineProperty(Task.prototype, `set${capitalize(scheduleProps[i])}`, { 
    enumerable: true, 
    configurable: false, 
    writable: true, 
    value: (value) => { 
     this.schedule[scheduleProps[i]] = value; 
    } 
    }); 
} 

Wenn ich die folgende Art und Weise nenne ich obj.schedule.repeatEvery erwarten Wert enthalten 10.

obj = new Task(); 
obj.setRepeatEvery(10); 

Stattdessen bekomme ich

TypeError: Cannot set property 'repeatEvery' of undefined 

Ich habe sogar versucht zu setzen die Funktionen wie so

Task.prototype[`set${capitalize(scheduleProps[i])}`] = (val) => { 
    this.schedule[scheduleProps[i]] = val; 
    } 

In diesem Fall bekomme ich

TypeError: Cannot set property 'interval' of undefined 
at Task.(anonymous function) [as setRepeatEvery] 

Wie kann ich Methoden auf eine Function.prototype dynamisch gesetzt? Vielen Dank für Ihre Hilfe

+4

Wo ist der Schleifendurchlauf? Lambda (Pfeil) -Funktionen haben nicht den richtigen 'this'-Bereich, wenn diese Schleife nicht in einer Member-Methode ausgeführt wird. versuchen Sie es mit einer normalen 'Funktion' –

+0

Awesome Balázs !! Ich musste es in den Konstruktor verschieben und es funktionierte. Ich muss sie als Lambda-Funktion haben, um die Funktionen auf den Hauptfunktionsprototyp zu setzen –

+0

JSON ist ein Datenaustauschformat, wie XML oder YAML. In Ihrem Beispiel wird kein JSON angezeigt. JavaScript-Objekte sind nicht JSON. –

Antwort

1

Sie wurden mit Blick auf die Ausgabe vor allem wegen der Funktionszuweisung für „Wert“ Taste.

Sie können einige Änderungen finden dort die eine Schließung und verändert auch die Syntax der Zuweisung einer Funktion bei Schlüssel eines Objekts erstellt wird.

Abschluss wird erstellt, um den Wert von i für diese bestimmte Iteration beizubehalten.

function Task() { 
 
    this.action = {}; 
 
    this.schedule = {}; 
 
} 
 

 
function capitalize(str) { 
 
    return `${str[0].toUpperCase()}${str.slice(1)}`; 
 
} 
 

 
const scheduleProps = [ 
 
    'startAt', 
 
    'repeatEvery', 
 
    'endAt', 
 
    'count', 
 
    'interval' 
 
]; 
 

 
for(var i=0; i<scheduleProps.length; i++) { 
 
    Object.defineProperty(Task.prototype, `set${capitalize(scheduleProps[i])}`, { 
 
    enumerable: true, 
 
    configurable: false, 
 
    writable: true, 
 
    value: (function(i) { return function(value) { this.schedule[scheduleProps[i]] = value;} })(i) 
 
    }); 
 
} 
 

 
obj = new Task(); 
 
obj.setRepeatEvery(10);

+0

Danke Jitendra, ich musste die for-Schleife in den Konstruktor Task() verschieben. Durch das Hinzufügen einer anonymen Funktion ist ** das ** der Umfang der anonymen Funktion. Ich wollte, dass die Methoden zum Task.prototype –

+0

hinzugefügt werden. Durch obigen Code sind diese Funktionen bereits auf dem Prototyp der Task-Klasse. Sie können diesen Code in der Browser-Konsole ausführen und danach "Task.prototype" eingeben. Dieser Wille zeigt euch alle dort. –

+1

Eine Antwort sollte erklären, warum das OP sein Problem hat und wie es zu beheben ist. – RobG

Verwandte Themen