📝

Array.prototype.reduce()とかのprototypeってなに?

2021/12/10に公開

今まで何回もこれをやってきました

やめ太郎さんリスペクト)

ワイ「あー、JavaScriptの配列のreduceメソッドの使い方忘れた」
ワイ「脳みその容量がreduceされとるがな
ワイ「"JS array.reduce"で検索っと」
ワイ「お、出てきた出てきた。天下のMDN様や」
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
ワイ「ん...?」
ワイ「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'
// ]

参考にした資料
https://www.amazon.co.jp/dp/4873119235/

Discussion

Hidden comment