Loading...

Курулган класстарды кеңейтүү

Курулган класстарды кеңейтүү

 

Array Сиз ошондой эле , Map жана башкалар сыяктуу орнотулган класстардан мураска аласыз.

Мисалы, бул мисал PowerArraybuildinден мураска алат 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методдор ж .filterArraySymbol.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.keysArray.isArrayж.б.

Белгилүү болгондой, орнотулган класстар бири-бирин кеңейтет.

Адатта, бир класс экинчисинен тукум кууп өткөндө, статикалык методдор да тукум кууп өтөт. Бул Статикалык касиеттер жана методдор бөлүмүндө кеңири түшүндүрүлгөн .

Бирок орнотулган класстар өзгөчө болуп саналат. Алар бири-биринин статикалык ыкмаларын мурасташпайт.

Мисалы, жана Array, жана Dateдан тукум кууйт Object, ошондуктан from ыкмалары алардын инстанцияларында жеткиликтүү Object.prototype. Бирок Array.[[Prototype]]шылтабайт , ошондуктан эч кандай же ыкмалары Objectжок .Array.keys()Date.keys()

Төмөндө сиз структураны көрөсүз Dateжана Object:

DateКөрүнүп тургандай, жана ортосунда эч кандай байланыш жок Object. Алар көз карандысыз, бир гана Date.prototypeмурас Object.prototype.

Бул орнотулган объекттерди мурастоо менен биз колдонгон нерсенин ортосундагы маанилүү айырма extends.