2017-03-24 14 views
2

私はnodejsの初心者です。 私は、スキーマを使用してJSONを構築するためのヘルパ関数を作成しています。設定値に関数(主にセッター)を追加しようとしています。以下は簡単なバージョンです。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' 
]; 

私はobj.schedule.repeatEveryが値10

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

が含まれていることを期待し、以下の方法を呼び出すときに代わりに私が

取得

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

動的そこにメソッドを追加

TypeError: Cannot set property 'repeatEvery' of undefined 

私も設定しようとしましたそう

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

この場合のような機能は、私は動的にfunction.prototypeにメソッドを設定するにはどうすればよい

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

を取得しますか?あなたの助け

+4

どこループ実行はありますか?ループがメンバメソッド内で実行されない場合、Lambda(矢印)関数は正しい 'this'スコープを持ちません。通常の 'function'を使ってみてください –

+0

恐ろしいバラツ!私はそれをコンストラクタに移さなければなりませんでした。関数をメイン関数プロトタイプに設定するためにラムダ関数としてそれらを持つ必要があります –

+0

JSONはXMLやYAMLのようなデータ交換形式です。あなたの例ではJSONが表示されません。 JavaScriptオブジェクトはJSONではありません。 –

答えて

1

ため どうもありがとうあなたが主な理由は、「値」キーため機能割り当ての問題に直面していました。

あなたはいくつかの変更閉鎖を作成しても、オブジェクトのキーに機能を割り当てる構文は変更されています。

閉鎖は、特定の反復のためにiの値を維持するために作成されます。

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

ありがとうJitendra、私はタスク()コンストラクタにforループを移動する必要がありました。匿名関数を追加することにより、** this **は匿名関数の範囲となります。メソッドをTask.prototype –

+0

に追加したかったのです。上記のコードでは、それらの関数はすでにタスククラスのプロトタイプになっています。このコードをブラウザコンソールで実行し、その後に "Task.prototype"と入力することができます。これはあなたにすべてのことを示すでしょう。 –

+1

答えにOPがなぜ問題を抱えているのか、それを修正する方法を説明してください。 – RobG

関連する問題