"Расширять" массив JS, как в традиционных языках OO? - PullRequest
0 голосов
/ 17 декабря 2018

Я копаю глубже в JavaScript.Я знаю, что можно изменять / улучшать поведение объектов JavaScript, изменяя прототипы.

Для специальных целей я хотел бы взять массив и добавить к нему все виды поведения.Я ПОЛНОСТЬЮ понимаю, что ПЛОХО менять все Массивы для моего случая.Но это обычный ОО-язык, я мог бы просто расширить его, добавить свои функции, оставить оригинал в покое.Есть ли что-нибудь сопоставимое в JS?Например, я могу скопировать прототип Array и поместить его в другой класс и поиграть с ним, не затрагивая другие массивы?Или какие-то понятия?

Не критично, но это было бы полезно и, безусловно, помогло бы мне глубже понять JS, с которым я действительно сталкиваюсь после многих лет Java, C ++ и т. Д.

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Я думаю, вы можете просто использовать ES6 extends, как и на любом другом языке OO.

Вот пример класса, который расширяет собственный массив и добавляет журналметод.Единственная проблема, связанная с этим, заключается в том, что вам придется использовать ключевое слово new для создания нового массива.

class CustomArray extends Array {
	log() {
		console.log(this);
    }
}

var customArrayInstance = new CustomArray();

customArrayInstance.push(1,2,3,4,5);

customArrayInstance.log();

// Creating an array using the array constructor
//
new CustomArray(200).fill(null).log()

То, что вы также можете сделать, это использовать Symbols для расширения поведения собственного массива способом, отличным от ООП.По сути, вы будете расширять прототип собственного массива, не нарушая браузер.

0 голосов
/ 17 декабря 2018

Да, вы можете сделать это, и в JavaScript мы называем эту вещь интерфейса прототипом .

Function.prototype.method = function(name, func) {
  this.prototype[name] = func;
  return this;
};

Хотя лично я обычно предпочел бы сделать «метод» независимой функцией, которая принимает и возвращает массив.

0 голосов
/ 17 декабря 2018

Вы можете расширить класс Array и реализовать дополнительные функции в качестве методов этого класса.

Вместо использования let x = []; вы теперь используете let y = new myArray();.

class myArray extends Array {
  constructor() {
    super();
    
    console.log(typeof this.push);
    console.log(typeof this.shift);
  }
  
  logAndAdd(variable) {
    this.push(variable);
    console.log(variable);
  }
}

let y = new myArray();

y.logAndAdd('hi');
0 голосов
/ 17 декабря 2018

Я думаю, что взглянуть на итераторы Javascript и их возможности - это один из вариантов.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols

Я использовал этот подход в Typescript / Angular2 для создания коллекций, подобных массивам, гдеЯ могу определять пользовательские операции push / pop / pull как OO.

...