首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以重写Javascript数组或对象以使其可调用吗?

可以重写Javascript数组或对象以使其可调用吗?
EN

Stack Overflow用户
提问于 2011-10-12 04:38:38
回答 3查看 1.3K关注 0票数 8

我想知道Array[]和Object[]是否可以被数组()和对象()所取代。是否可以将函数原型嵌入到数组或对象原型链中,以使其可调用。基本上,我正在寻找一些像这样的东西:

代码语言:javascript
复制
// some magic with prototypes
????????????????

a = [1, 3, 4]
b = [1, 3, 4]

console.log(a[1]) // prints 3
console.log(b(1)) // prints 3

a[0] = -1
// same as
b(0, -1)

console.log(a[1], b(1)) // prints -1 -1

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-13 05:36:08

您可能不想这样做,尤其是在任何浏览器中。这并没有很多Array的好特性,包括效率。这就是说:

代码语言:javascript
复制
function ArrayFunction (arr) {
  var f = function s (p, v) {
    if (v !== undefined) {
      s[p] = v
    }
    return s[p]
  }

  for (var i = 0; i < arr.length; i++) {
    f[i] = arr[i]
  }

  return f
}

var a = new ArrayFunction([1, 3, 4])
var b = new ArrayFunction([1, 3, 4])

b(1, 5)
a[1] //3
b[1] //5

我最初想使用原型,但是对象不会从它们的原型中继承可调性。

编辑:上面的修复为不使用arguments。这个版本不允许您将值设置为undefined,但这通常不被认为是一个好的实践。

票数 2
EN

Stack Overflow用户

发布于 2011-10-12 04:48:45

问得好,但答案是否定的,因为对象不是函数。

你能得到的最接近的结果是:

Array.prototype.set = function(a,b) { this[a] = b; };

然后您可以执行以下操作:

b.set(0, -1);

票数 2
EN

Stack Overflow用户

发布于 2011-10-12 05:10:43

Javascript不支持像那样的操作符重载。我想不出让一个变量同时支持[]和()访问的方法,但是如果您不需要[]访问,您可以尝试如下所示:

代码语言:javascript
复制
var weird_array = (function() {
    var data = [1,2,3];
    return function(idx, n) {
        if (arguments.length === 1)
            return data[idx];
        else if (arguments.length === 2)
            return (data[idx] = n);
    };   
})();

在这个例子中,weird_array实际上不是一个数组,所以你不能对它使用[],但它是一个函数(包装在一个数据数组中)。然后你可以这样做:

代码语言:javascript
复制
weird_array();  // => undefined
weird_array(0); // => 1
weird_array(1); // => 2
weird_array(2); // => 3
weird_array(3); // => undefined
weird_array(1, 5); // => 5
weird_array(1); // => 5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7732193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档