Array
Сиз ошондой эле , Map
жана башкалар сыяктуу орнотулган класстардан мураска аласыз.
Мисалы, бул мисал PowerArray
buildinден мураска алат Array
:
@A@// добавим один метод (можно более одного)
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
let filteredArr = arr.filter(item => item >= 10);
alert(filteredArr); // 10, 50
alert(filteredArr.isEmpty()); // false@A@
filter
Кызыктуу жагдайга көңүл буруңуз: , жана башкалар сыяктуу орнотулган ыкмалар map
тукум кууган класстын жаңы объекттерин кайтарат PowerArray
. Алардын ички ишке ашыруусу, алар муну жасоо үчүн объекттин касиетин колдонушат constructor
.
Жогорудагы мисалда,
arr.constructor === PowerArray
Демек, метод чакырылганда, arr.filter()
ал ички натыйжалардын массивин түзөт, атап айтканда arr.constructor
, кадимки массивди эмес, колдонуп. Бул абдан жакшы, анткени сиз PowerArray
жыйынтыктар боюнча мындан ары дагы ыкмаларды колдоно аласыз.
Мындан тышкары, биз бул жүрүм-турумун өзгөчөлөштүрүү болот.
Атайын статикалык алуучунун жардамы менен Symbol.species
сиз JavaScript колдоно турган конструкторду filter
жана map
жаңы объекттерди түзүү үчүн башка ыкмаларды кайтара аласыз.
Кадимки массивдерди кайтарууну каалаган map
методдор ж .filter
Array
Symbol.species
@A@class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}
// встроенные методы массива будут использовать этот метод как конструктор
static get [Symbol.species]() {
return Array;
}
}
let arr = new PowerArray(1, 2, 5, 10, 50);
alert(arr.isEmpty()); // false
// filter создаст новый массив, используя arr.constructor[Symbol.species] как конструктор
let filteredArr = arr.filter(item => item >= 10);
// filteredArr не является PowerArray, это Array
alert(filteredArr.isEmpty()); // Error: filteredArr.isEmpty is not a function@A@
Көрүнүп тургандай, ал азыр .filter
кайтып келет Array
. Кеңейтилген функциялар берилбейт.
Map
, сыяктуу башка коллекциялар да Set
ушундай эле иштейт. Алар да колдонушат Symbol.species
.
Курулган класстардын статикалык мурасы жок
Камтылган объектилердин өзүнүн статикалык ыкмалары бар Object.keys
, Array.isArray
ж.б.
Белгилүү болгондой, орнотулган класстар бири-бирин кеңейтет.
Адатта, бир класс экинчисинен тукум кууп өткөндө, статикалык методдор да тукум кууп өтөт. Бул Статикалык касиеттер жана методдор бөлүмүндө кеңири түшүндүрүлгөн .
Бирок орнотулган класстар өзгөчө болуп саналат. Алар бири-биринин статикалык ыкмаларын мурасташпайт.
Мисалы, жана Array
, жана Date
дан тукум кууйт Object
, ошондуктан from ыкмалары алардын инстанцияларында жеткиликтүү Object.prototype
. Бирок Array.[[Prototype]]
шылтабайт , ошондуктан эч кандай же ыкмалары Object
жок .Array.keys()
Date.keys()
Төмөндө сиз структураны көрөсүз Date
жана Object
:
Date
Көрүнүп тургандай, жана ортосунда эч кандай байланыш жок Object
. Алар көз карандысыз, бир гана Date.prototype
мурас Object.prototype
.
Бул орнотулган объекттерди мурастоо менен биз колдонгон нерсенин ортосундагы маанилүү айырма extends
.