使用默认函数扩展JavaScript对象

时间:2015-03-13 20:46:09

标签: javascript arrays prototype javascript-objects

在谷歌应用程序脚本中,我有一个一维数据数组,我可以从中获取值:

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"));
&#13;
&#13;
&#13;

但这是一个比我想要的稍微笨重的调用语法。

基于default functions上的这个问题,看起来可以为对象分配默认函数,但他们只是通过创建这样的函数对象来实现这一点: / p>

var test = new func(function() {
    // do something
});

我可以扩展数组,以便在作为方法调用时执行默认函数吗?

1 个答案:

答案 0 :(得分:3)

简单地说,如果某项功能尚未成为某项功能,您就无法将某项功能融入其中,并且您无法真正扩展数组。

你可以做的是创建一个包装器函数,它包装一个数组并提供你想要的功能,还包括在需要时恢复原始数组的能力:

&#13;
&#13;
var wrapper = (function() {
  function getColumnNumber(str) {
    return Array.prototype.reduce.call(str.toUpperCase(), function (t, c) {
        return 26 * t + c.charCodeAt(0) - 64;
    }, 0) - 1;
  }

  return function(arr) {
    return function(col, val) {
      if (arguments.length === 0) {
        return arr;
      }
      if (arguments.length > 1) {
        arr[getColumnNumber(col)] = val;
      }
      return arr[getColumnNumber(col)];
    };
  };
})();

var w = wrapper([10, 20, 30, 40, 50]);

snippet.log(w('D')); // 40

w('D', 33);          // set value

snippet.log(w('D')); // 33

w()[3] = 42;         // access underlying array directly
w().push(60);

snippet.log(w('D')); // 42
snippet.log(w('F')); // 60
&#13;
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;