Array.prototype в JavaScript — прототип і методи масиву


Опис

Властивість Array.prototype виступає як прототип для всіх об'єктів класу Array. Завдяки їй відкривається доступ до різноманітних методів, призначених для ефективної роботи з масивами.

Array.prototype містить численні вбудовані методи, такі як push(), pop(), shift(), unshift(), forEach() та інші, які спрощують роботу з масивами. Вони стають доступними для кожного створеного масиву завдяки механізму прототипного наслідування.

Якщо вам потрібно розширити функціонал всіх масивів, ви можете додавати свої методи безпосередньо до Array.prototype. Наприклад, якщо ви хочете мати метод, який повертає середнє значення елементів масиву, ви можете додати його так:

Array.prototype.average = function() {
    let sum = this.reduce((acc, val) => acc + val, 0);
    return sum / this.length;
};

Після цього, кожен масив отримає доступ до методу average().

Хоча Array.prototype дає величезні можливості для розширення функціоналу масивів, важливо обережно підходити до додавання нових методів. Неконтрольовані зміни можуть призвести до конфліктів з майбутніми стандартами або з іншими бібліотеками.

автор: Bond

Загальний опис

автор: NagarD

Порада

Користувачі, які знайомі з об'єктно-орієнтованим програмуванням, часто використовують Array.prototype для наслідування та створення своїх власних класів, які базуються на масивах, але мають специфічний для додатка функціонал.

автор: Bond
Нотатка

prototype є властивістю, доступною для всіх JavaScript-об'єктів.

автор: Bond

Синтаксис

Array.prototype.name = value;

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE
1 1 1 4 12
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
37 18 4 1
Підтримка: серверні переглядачі
Переглядач Node.js Deno
0.10.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

Властивість prototype в JavaScript дозволяє додавати нові властивості до об'єктів.

function Person(first, last, age, eyecolor) {
  this.firstName = first;
  this.lastName = last;
  this.eyeColor = eyecolor;
}

Person.prototype.nationality = "Ukrainian";
автор: Bond

Цей приклад демонструє, як розширити вбудований об'єкт Array в JavaScript, додавши нові методи myUcase() та myLcase(), які переводять рядкові елементи масиву в верхній та нижній регістр відповідно. Також показано, як можна виконувати перевірку типу, перед тим як виконувати операції над елементами масиву.

HTML

<header>
  <h2 class="title">Розширення Array: myUcase() і myLcase()</h2>
  <p class="description">Розширюємо вбудований об'єкт Array в JavaScript, додаючи нові методи myUcase() та myLcase(), які переводять рядкові елементи масиву в верхній та нижній регістр відповідно.</p>
</header>
<main>
  <div class="result">
    <h3 class="result-title">Оригінальний масив:</h3>
    <pre id="originalArray"></pre>
    <h3 class="result-title">Масив після myUcase():</h3>
    <pre id="uppercasedArray"></pre>
    <h3 class="result-title">Масив після myLcase():</h3>
    <pre id="lowercasedArray"></pre>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

pre {
  color: #ff0000;
  letter-spacing: 1px;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.result {
  background-color: #f8f8f8;
  padding: 15px;
  -webkit-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  -moz-box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

.result-title {
  font-weight: bold;
  color: #333;
}

JS

Array.prototype.myUcase = function () {
  for (let i = 0; i < this.length; i++) {if (window.CP.shouldStopExecution(0)) break;
    if (typeof this[i] === "string") {
      this[i] = this[i].toUpperCase();
    }
  }window.CP.exitedLoop(0);
};

Array.prototype.myLcase = function () {
  for (let i = 0; i < this.length; i++) {if (window.CP.shouldStopExecution(1)) break;
    if (typeof this[i] === "string") {
      this[i] = this[i].toLowerCase();
    }
  }window.CP.exitedLoop(1);
};

var fruits = ["Banana", "Orange", "Apple", "Mango", 123, "Kiwi"];
document.getElementById('originalArray').innerText = JSON.stringify(fruits, null, 2);

fruits.myUcase();
document.getElementById('uppercasedArray').innerText = JSON.stringify(fruits, null, 2);

fruits.myLcase();
document.getElementById('lowercasedArray').innerText = JSON.stringify(fruits, null, 2);
//# sourceURL=pen.js
автор: Bond

Прогін показує ланцюжок прототипів масиву, різницю між Array.prototype і arr.prototype, позичання методів чужим об’єктам і головну пастку розширення: доданий звичайним способом метод вилазить у for...in, а доданий через defineProperty — ні.

// Array.prototype — це сам по собі порожній масив
console.log('Array.isArray(Array.prototype):', Array.isArray(Array.prototype)); // true
console.log('його length:', Array.prototype.length);                            // 0

const arr = [10, 20];

// ⚠️ у ЕКЗЕМПЛЯРА властивості prototype немає — це часта плутанина
console.log('arr.prototype:', arr.prototype);                                   // undefined
console.log('справжній прототип:', Object.getPrototypeOf(arr) === Array.prototype); // true
console.log('методи беруться звідти:', arr.map === Array.prototype.map);        // true

// далі ланцюжок веде до Object.prototype і завершується null
console.log('над ним Object.prototype:', Object.getPrototypeOf(Array.prototype) === Object.prototype); // true
console.log('а над тим:', Object.getPrototypeOf(Object.prototype));             // null

// методи можна позичати чужим об'єктам
const arrayLike = { 0: 'а', 1: 'б', length: 2 };
console.log('slice на псевдомасиві:', Array.prototype.slice.call(arrayLike));   // ["а","б"]
console.log('map на рядку:', Array.prototype.map.call('абв', (c) => c.toUpperCase())); // ["А","Б","В"]

// а тепер класична пастка розширення прототипу
Array.prototype.average = function () {
    return this.reduce((a, b) => a + b, 0) / this.length;
};
console.log('свій метод працює:', [2, 4, 6].average());                         // 4

const keys = [];
for (const k in [10, 20]) { keys.push(k); }
console.log('for...in зачепив чужий метод:', keys);                             // ["0","1","average"]

const values = [];
for (const v of [10, 20]) { values.push(v); }
console.log('for...of не зачепив:', values, '/ length:', [10, 20].length);      // [10,20] / 2

delete Array.prototype.average;

// правильний спосіб — неперелічувана властивість
Object.defineProperty(Array.prototype, 'average', {
    value: function () { return this.reduce((a, b) => a + b, 0) / this.length; },
    enumerable: false,
    configurable: true,
});

const keys2 = [];
for (const k in [10, 20]) { keys2.push(k); }
console.log('після defineProperty for...in чистий:', keys2, '/ метод живий:', [2, 4, 6].average()); // ["0","1"] / 4

// саму властивість Array.prototype перезаписати не можна
const d = Object.getOwnPropertyDescriptor(Array, 'prototype');
console.log('writable:', d.writable, '| configurable:', d.configurable);        // false | false
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід