Javascript Возможно ли создать прототип массива конкретного объекта?

1

Привет, мир,

Я хочу создать прототип массива.

Array.prototype.foo = function(){}

Но мой прототип должен применяться только в том случае, если этот массив содержит только определенный объект, например "bar". Возможно ли создать такой прототип в javascript? :

Array<bar>.prototype.foo = function(){}

Спасибо! Джеймс

  • 3
    Кажется, здесь есть путаница в терминах, может быть, и у вас на уме, поэтому: в этой строке Array.prototype.foo = function(){}; вы не создаете прототип массива. Вы расширяете существующий прототип Array новым свойством (что может быть плохой идеей). Можете ли вы объяснить с большей точностью, что вы хотите сделать? Кстати, Javascript не является типизированным языком, поэтому вторая строка невозможна
  • 1
    Вы должны расширить свой вопрос, предоставив вариант использования и желаемое поведение.
Показать ещё 1 комментарий
Теги:
object
arrays
prototype

4 ответа

0
Лучший ответ

Я думаю, что вы можете сделать что-то подобное. Лучший способ, который я могу сделать, - это украсить массив JavaScript по умолчанию дополнительной функцией. Ниже приведен пример работы функции печати.

let test = ['a', 'b', 'c'];

function decoratedArray(args) {
  let decorated = [...args];
  decorated.print = () => {
    decorated.forEach((arg) => {
      console.log(arg);
    });
  }
  
  return decorated;
}

test = decoratedArray(test);

test.print();
  • 0
    Отлично! Мне нравится ваше решение! Я не рискну перебирать все массивы!
  • 0
    Эй, спасибо, я рад, что это сработало!
Показать ещё 2 комментария
2

Нет, ты не можешь.

Вы можете проверить типы в своем текущем массиве.

class Bar {}

Array.prototype.foo = function() {
  if (this.some((n) => !(n instanceof Bar))) throw new Error('Incompatible type.');
  
  console.log('called');
}

let array = [1, 2];
try {
  array.foo();
} catch(e) {
  console.log(e.message);
}

array = [new Bar(), new Bar()];
array.foo();
1

Один из способов сделать это - проверить, содержит ли ваш массив bar прежде чем делать что-либо еще, и остановить, если это не так:

    Array.prototype.foo = function(){
    	if (this.indexOf('bar') === -1) {
    		throw "The array must contain bar";
    	}
    	// do what must be done
      console.log("all good");
    }
    
    var rightOne = ['john', 'jane', 'bar'];
    var wrongOne = ['john', 'jane'];
    
    rightOne.foo();
    wrongOne.foo();
    
  • 0
    Не могли бы вы сделать этот исполняемый файл в качестве примера?
  • 1
    Я отредактировал свой ответ.
0

С классами ES6 вы можете подклассифицировать Array, чтобы получить все внутренние методы, и добавить к нему свои собственные методы без изменения собственного прототипа Array.

class Bar {
  constructor(id) {
    this.id = id
  }
}
  
class Foo extends Array {
  constructor(...args) {
    super(...args)
  }
  foo() {
    if (this.some(x => x instanceof Bar === false))
      throw new Error('Foo can only contain Bar instances')
    console.log('All items are Bars')
    return this
  }
}

const pass = new Foo(new Bar(1), new Bar(2))
const fail = new Foo(new Bar(3), new Object)

pass.foo()
fail.foo()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню