Привет, мир,
Я хочу создать прототип массива.
Array.prototype.foo = function(){}
Но мой прототип должен применяться только в том случае, если этот массив содержит только определенный объект, например "bar". Возможно ли создать такой прототип в javascript? :
Array<bar>.prototype.foo = function(){}
Спасибо! Джеймс
Я думаю, что вы можете сделать что-то подобное. Лучший способ, который я могу сделать, - это украсить массив 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();
Вы можете проверить типы в своем текущем массиве.
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();
Один из способов сделать это - проверить, содержит ли ваш массив 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();
С классами 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()
Array.prototype.foo = function(){};
вы не создаете прототип массива. Вы расширяете существующий прототип Array новым свойством (что может быть плохой идеей). Можете ли вы объяснить с большей точностью, что вы хотите сделать? Кстати, Javascript не является типизированным языком, поэтому вторая строка невозможна