【发布时间】:2015-05-16 11:47:49
【问题描述】:
在谷歌应用脚本中,我有一个一维数据数组,我可以像这样获取值:
data[0]
我希望能够像这样传递列名:
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,它不需要是一个数组,但这是最方便的,因为它是
getValues返回的内容。我可能可以将整个东西包装在一个对象中,但无论如何我认为这是一个有趣的问题。 -
@t.niese,它在为 javascript 提供执行环境的 Google Apps 脚本服务器上运行。但它的范围很窄。我只是提到它来对冲主张反对扩展我不拥有的对象的 cmets。我在这里没那么担心。
-
如果您不需要支持旧版浏览器,则可以使用
Map。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
就像一个注释为什么不能创建一个可调用的数组:一个函数被定义为有一个属性
length,这个属性是writeable: no。因此,如果使用__proto__或类似的东西构建具有Array的功能并且可调用的东西,你最终会得到一个可调用的 array ,它无法更改它的length。
标签: javascript arrays prototype javascript-objects