私は毎週このミートアップに参加し、有効な javascript: 68 の方法という本について話し合っていました。
項目 36: インスタンス オブジェクトにのみインスタンスの状態を保存する で、それを説明するために次の例を作成しました。
function User() {}
User.prototype = {
hobbies: [], // should be instance state!
addHobby: function (x) {
this.hobbies.push(x);
}
};
以下のユーザーをインスタンス化します。
boy = new User();
// User {hobbies: Array[0], addHobby: function}
girl = new User();
// User {hobbies: Array[0], addHobby: function}
boy.addHobby("swimming");
girl.addHobby("running");
// undefined
boy.hobbies
// ["swimming", "running"]
girl.hobbies
// ["swimming", "running"]
ご覧のとおり、addHobby 関数はプロトタイプ レベルで趣味に影響を与えます。
コード全体を次のように変更すると
function User() {}
User.prototype = {
hobbies: [], // should be instance state!
addHobby: function (x) {
newArr = new Array(x);
this.hobbies = this.hobbies.concat(newArr);
}
};
boy = new User();
girl = new User();
boy.addHobby("swimming");
girl.addHobby("running");
boy.hobbies
//["swimming"]
girl.hobbies
//["running"]
その理由が割り当てのためであることはわかっています。this.hobbies = this.hobbies.concat(newArr);
がプロトタイプ レベルではなくインスタンス レベルに割り当てられる理由の完全な説明を探しています。両方のインスタンスでこの用語this.hobbies
が使用されています。