В скриптах приложений Google У меня есть один одномерный массив данных, который я могу получить значения из так:Продлить объект JavaScript с помощью функции по умолчанию
data[0]
Я хотел бы быть в состоянии пройти в колонке name вместо этого вот так:
data("A")
Таким образом, мне не нужно преобразовывать буквы в их позицию в массиве. Поэтому я хотел бы расширить объект массива (расширение не является рискованным, так как оно работает в изолированной среде сценария).
Я знаю, что могу добавить функцию к прототипу массива, используя этот letter to number function и это object extension question так:
Array.prototype.byCol = function(colName) {
return this[getColumnNumber(colName) - 1];
}
function getColumnNumber(str) {
var out = 0, len = str.length;
for (pos = 0; pos < len; pos++) {
out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - pos - 1);
}
return out;
}
var data = [1,2,3,4];
document.write(data.byCol("B"));
Но это немного громоздким вызова синтаксис, чем я хотел.
На основе этого вопроса на default functions, похоже, что можно назначить функцию по умолчанию для объекта, но они делают это, просто создав объект функции вроде этого:
var test = new func(function() {
// do something
});
Могу ли я получить расширить массив так, чтобы он выполнял функцию по умолчанию при вызове как метод?
Вы не можете создать что-то, что является как массивом, так и функцией. Нужно ли вам быть массивом? Похоже, что вы хотите, это обычный объект. – JLRishe
@JLRishe, это не * требуется *, чтобы быть массивом, но это то, что наиболее удобно, поскольку это то, что возвращается ['getValues'] (https://developers.google.com/apps-script/reference/spreadsheet/ диапазон # GetValues ()). Возможно, я мог бы обернуть все это в объект, но я думаю, что это интересная проблема. – KyleMit
@ t.niese, он запускается на сервере сценариев Google Apps, который обеспечивает среду выполнения для javascript. Но он имеет довольно узкую область. Я только упоминал об этом, чтобы хеджировать комментарии, которые выступали против распространения объектов, которые у меня нет. Меня это не так беспокоит. – KyleMit