📝
Array.prototype.reduce()とかのprototypeってなに?
今まで何回もこれをやってきました
(やめ太郎さんリスペクト)
ワイ「あー、JavaScriptの配列のreduceメソッドの使い方忘れた」
ワイ「脳みその容量がreduceされとるがな」
ワイ「"JS array.reduce"で検索っと」
ワイ「お、出てきた出てきた。天下のMDN様や」
ワイ「ん...?」
ワイ「Array.prototype.reduce()...?」
ワイ「prototypeって、なんや...?」
ワイ「.....」
ワイ「まあ、いっか」
たまたま調子が良かったので今回は調べました
JavaScriptのクラスは「プロトタイプチェーン」という仕組みをもとに継承を行っており、クラスに定義されたメソッド・コンストラクタ・ゲッター・セッターがそのクラスの"prototype"というプロパティに保存されるているようです。
// Object.getOwnPropertyNames():オブジェクトが持つプロパティ名を配列で返す
console.log(Object.getOwnPropertyNames(Array.prototype));
// 出力
// [
// 'length', 'constructor', 'concat',
// 'copyWithin', 'fill', 'find',
// 'findIndex', 'lastIndexOf', 'pop',
// 'push', 'reverse', 'shift',
// 'unshift', 'slice', 'sort',
// 'splice', 'includes', 'indexOf',
// 'join', 'keys', 'entries',
// 'values', 'forEach', 'filter',
// 'flat', 'flatMap', 'map',
// 'every', 'some', 'reduce',
// 'reduceRight', 'toLocaleString', 'toString'
// ]
また、クラスからインスタンスを生成する際に、クラスのprototype
プロパティの値はインスタンスの__proto__
プロパティにセットされます。ですので、例えばArrayで適当なインスタンスを作ってその__proto__
を参照すると、先程と同じ結果が得られます。
const newArray = new Array();
console.log(Object.getOwnPropertyNames(newArray.__proto__));
// 出力
// [
// 'length', 'constructor', 'concat',
// 'copyWithin', 'fill', 'find',
// 'findIndex', 'lastIndexOf', 'pop',
// 'push', 'reverse', 'shift',
// 'unshift', 'slice', 'sort',
// 'splice', 'includes', 'indexOf',
// 'join', 'keys', 'entries',
// 'values', 'forEach', 'filter',
// 'flat', 'flatMap', 'map',
// 'every', 'some', 'reduce',
// 'reduceRight', 'toLocaleString', 'toString'
// ]
参考にした資料
Discussion