Webプログラミングを学習する目的で、読めそうなnpmパッケージ(ideas)を読んでいたところ、挙動が分からない箇所があったので質問させてください。
以下のようにインスタンスを作成する処理がありました。((省略)
部分は私が編集したものです)
javascript:
1var idea = new Idea(err => { 2 if (err) { return logger.log(err, "error"); } 3 var commands = { 4 create: callback => { 5 ....(省略).... 6 } 7 ....(省略).... 8 , help: () => { 9 ....(省略).... 10 } 11 }; 12 13 if (~process.argv.indexOf("-h") || ~process.argv.indexOf("--help")) { 14 return commands.help(); 15 } 16 17 if (!commands[process.argv[2]]) { 18 process.argv[2] = "filter"; 19 } 20 21 commands[process.argv[2]]((err, res) => { 22 ....(省略).... 23 display(res); 24 }); 25});
クラス定義はこのようになっています。
javascript
1class Idea { 2 constructor (path, callback) { 3 if (typeof path === "function") { 4 callback = path; 5 path = null; 6 } 7 8 // Defaults 9 this.path = path = path || DEFAULT_PATH; 10 callback = callback || (err => { if (err) throw err }); 11 12 // Init 13 if (!isThere(this.path)) { 14 this.ideas = []; 15 this.save(callback); 16 } else { 17 this.list((err, ideas) => { 18 if (err) { return callback(err); } 19 this.ideas = ideas; 20 callback(null, ideas, this); 21 }); 22 } 23 } 24 /** 25 * list 26 * Lists all ideas. 27 * 28 * @name list 29 * @function 30 * @param {Function} callback The callback function. 31 * @return {Idea} The `Idea` instance. 32 */ 33 list (callback) { 34 rJson(this.path, (err, content) => { 35 if (err) { return callback(err); } 36 callback(err, content); 37 }); 38 return this; 39 } 40 ....(省略)... 41 create (idea, callback) { 42 ....(省略).... 43 } 44 ....(省略)... 45} 46 47module.export = Idea;
コンストラクタによれば、このクラスは第一引数にパス名、第二引数にコールバック関数を受け取るようになっていますが、宣言時には無名関数でerr=>{}
だけを渡しています。
質問1
コンストラクタで無理やり各引数の値をnull
にしたりcallback=path
にしたりしているのは、JavaScriptではコンストラクタを複数作って引数の型や数で使い分けるような機能がないからでしょうか?また、こうした書き方はJS文化的に一般的なのでしょうか
質問2
list
メソッドはコールバック関数を受け取り、Ideaインスタンスを返すとありますが、そのコールバック関数はthis.list()
において
javascript
1this.list((err, ideas) => { 2 if (err) { return callback(err); } 3 this.ideas = ideas; 4 callback(null, ideas, this); 5});
と実装されており、この挙動がわかりません。この3つの引数をとるコールバック関数は一体どこでどんな役割を果たしているのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/25 13:07 編集