CreateLife ~AlwaysLatest~

プロトタイプについて

JavaScript

プロトタイプチェーンはどういう機能か

  • オブジェクトには必ず内部的にプロトタイププロパティを持っている
  • プロトタイププロパティの中にさらにプロトタイププロパティがネストされている
  • プロパティにアクセスした時にプロトタイププロパティの中を捜索する
const obj = {
	a: 1,
	b: 2,
};
console.log(obj); // ここにプロトタイププロパティが存在する

__ proto __ とは?

  • プロトタイププロパティが持つgetterとsetterのプロパティ名である
  • console.log()で出てくる__proto__はプロトタイププロパティそのものではない

プロトタイププロパティの確認方法

getter(非推奨)

console.log(obj.__proto__);

Object.getPrototypeOf

console.log(Object.getPrototypeOf(obj));

プロトタイププロパティの設定方法

setter(非推奨)

obj.__proto__ = {c:3};

Object.setPrototypeOf

Object.setPrototypeOf(obj, {c:3});

プロトタイプの設定とオブジェクトの設定を同時に行う

Object.create

const obj = Object.create({c:3});
obj.a = 1;
obj.b = 2;

setPrototypeOfとcreateはどちらを使う?

結論

createを使う⇒処理速度が全然違う

ただしそもそもプロトタイプを書き換える処理は避けよう

for-inとObject.keysの違い

プロトタイプまでループするかどうか

const obj = Object.create({c:3});
obj.a = 1;
obj.b = 2;

for(const key in obj){
	console.log(key); // a b c
}

console.log(Object.keys(obj)); // [a, b]

通常はプロトタイプまでループして欲しくないのでfor-ofを使うと良い

for(const key of Object.keys(obj)){
	console.log(key); // a b
}