3.0 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
587d7db2367417b2b2512b8a | クロージャーを使用してオブジェクト内のプロパティを外部から変更されないように保護する | 1 | 18234 | use-closure-to-protect-properties-within-an-object-from-being-modified-externally |
--description--
前回のチャレンジで、bird
には public プロパティの name
がありました。 bird
の定義の外側からアクセスして変更できるため、public とみなされます。
bird.name = "Duffy";
したがって、コードのどこからでも、bird
の名前を任意の値に簡単に変更できることになります。 たとえば、パスワードや銀行口座がコードベースのどこからでも簡単に変更できるような状況を考えてみてください。 これは多くの問題を引き起こす可能性があります。
この public (公開) プロパティを private (非公開) にするには、変数をコンストラクター関数の中で作成するのが最も簡単です。 コンストラクター関数内で作成すると、その変数のスコープが関数の内部に変更され、グローバルに利用できなくなります。 これにより、変数に対してアクセスや変更ができるのはコンストラクター関数内のメソッドのみになります。
function Bird() {
let hatchedEgg = 10;
this.getHatchedEggCount = function() {
return hatchedEgg;
};
}
let ducky = new Bird();
ducky.getHatchedEggCount();
この例で、getHatchedEggCount
は private 変数 hatchedEgg
にアクセスできるので、特権のあるメソッドになります。 これが可能になる理由は、hatchedEgg
が getHatchedEggCount
と同じコンテキストで宣言されているためです。 JavaScript では、関数は常に、自身が作成されたコンテキストにアクセスすることができます。 このようなコンテキストのことを closure
(クロージャー) と呼びます。
--instructions--
Bird
関数での weight
の宣言を変更して、private 変数にしてください。 次に、weight
の値として 15 を返すメソッド getWeight
を作成してください。
--hints--
weight
プロパティを private 変数にして、値 15
を割り当てる必要があります。
assert(code.match(/(var|let|const)\s+weight\s*\=\s*15\;?/g));
private 変数 weight
の値を返す getWeight
というメソッドを Bird
に作成する必要があります。
assert(new Bird().getWeight() === 15);
getWeight
関数は private 変数 weight
を返す必要があります。
assert(code.match(/((return\s+)|(\(\s*\)\s*\=\>\s*))weight\;?/g));
--seed--
--seed-contents--
function Bird() {
this.weight = 15;
}
--solutions--
function Bird() {
let weight = 15;
this.getWeight = () => weight;
}