こちらの記事は以下の書籍を参考に執筆しました
以下のコードはロックとキーのシステムを構築している。
function lock(secret){
const key = Symbol('key')
return {
key,unlock(keyUserd){
if(keyUserd==key){
return secret;
}else {
return '*'.repeat(secret.length || secret.toString().length)
}
}
}
}
const {key,unlock}=lock(42)
console.log(unlock())//**
console.log(unlock(Symbol('key')))//**
console.log(unlock('key'))//**
console.log(unlock(key))//42
正しいキーならsecretを取得でき、正しくないならキーをマスクしている。
#コードの解説
このコードを読む上でわからないことがいくつかあった。
-
return{key,unlock(...)}
とはどういうことか - unlock()で実行できるのはなぜか
#return {key,unlock(...)}
とはどういうことか
return {}
はオブジェクトを返しているということ。そしてオブジェクトには簡易表記という書き方ができる。
const obj = {
name: name,
method: function() {}
}
//簡易表記
const obj = {
name,
method() {}
}
プロパティ名(name)と変数名が同じ場合、一度指定すればいいだけになる。
{name:name}
と書いていたのが{name}
で済む。
またメソッドに関しては無名関数に限り{method:function(){}}
が{method()}
と書ける。
つまりlock関数を書き換えるとこういうこと
function lock(secret){
const key = Symbol('key')
return {
key:key,
unlock:function(keyUserd){
if(keyUserd==key){
return secret;
}else {
return '*'.repeat(secret.length || secret.toString().length)
}
}
}
}
そしてconst {key,unlock}=lock(42)
で変数keyにSymbol('key')
が代入され、変数unlockには無名関数が代入されている。
#unlock()で実行できるのはなぜか
これは勘違いであった。
その原因となったコードがこちら
const ffaa={
at(n){
if(n<=2)return 1;
return this.at(n-1)+this.at(n-2);
}
}
const {at}=ffaa;
const ff={at}
const aa={ff:at}
ffaa.at(7)//13
at(7)//エラー
ff.at(7)//13
aa.ff(7)//エラー
これだけを見ると、無名関数を分割した際、単純に変数名()
では実行でいなものと思ってしまった。
確かに関数を名前で参照出来ないこともあるが、それは関数内のメンバーを参照するときである。