class extends構文を使わずにArrayを継承する
ES2015からclass extends
を使うことでクラスを継承することができます。
今まではビルトインのArray
やError
の継承は内部プロパティを引き継ぐことができませんでした。
- Chapter 28. Subclassing Built-ins
- How ECMAScript 5 still does not allow to subclass array — Perfection Kills
ES2015からはclass extends
を使うと内部プロパティも含め継承できます。
length
プロパティの動作も継承できています。
class SubArray extends Array {
last(){
return this[this.length - 1];
}
}
var array = new SubArray(1,2,3);
array.push("x");
console.log(array.last()); // => "x"
console.log(array.length); // => 4
console.log(array instanceof Array); // => true
console.log(array.join()); // => "1,2,3,x"
array[10] = "no such item";
console.log(array.length); // => 11
内部的にはprototypeであることには変わらないので、class
という新しい構文を使わなくても同じ表現をすることがES2015からは可能です。(新しい構文じゃなくて関数的な書き方でできるという話)
function SubArray() {
return Reflect.construct(Array, arguments, SubArray)
}
SubArray.prototype.last = function(){
return this[this.length - 1];
}
Reflect.setPrototypeOf(SubArray.prototype, Array.prototype);
Reflect.setPrototypeOf(SubArray, Array);
var array = new SubArray(1,2,3);
array.push("x");
console.log(array.last()); // => "x"
console.log(array.length); // => 4
console.log(array instanceof Array); // => true
console.log(array.join()); // => "1,2,3,x"
array[10] = "no such item";
console.log(array.length); // => 11
Reflect.construct
を使うことでlength
プロパティの特殊な動きもちゃんと継承できています。
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。