在JavaScript中覆盖对象的括号[index] getter / setter?

时间:2012-12-13 11:59:46

标签: javascript object getter-setter

我目前正在构建Doubly linked list实施 我正在尝试(或希望)做的是使用setter / getter来设置列表中的元素,就像在数组中一样:

var index = 5;
list[index] = node_x;

但是,我不能只使用这种语法,因为节点在技术上不是列表的属性 将列表视为2个钩子。这两个挂钩连接到链条的两端,但是您只能访问这两个连接的链节(以及它们的兄弟姐妹通过它们)。
其余链链接不是列表的属性。这就是为什么我需要在我的对象上覆盖括号[]的实现,如果可能的话。

我的(简化/缩短)代码是:

(function () {
    "use strict"
    window.List = function () {
        var Length //Etc
        return {
            //Getter / Setter example.
            get length() {return this.Length;},
            set length(n) {this.Length = n;},
            //Function example.
            insertBeginning: function (newNode) {/*  */},
            insertEnd: function (newNode) {/*  */},

            //Index getter / setter attempt.
            get i(index){ console.log(index); },
            set i(index, node){ console.log(index); }
        };
    };

}());

var list = new List();
list.length = 10 //This works just fine
console.log(list.length) // Returns 10, like expected.

现在,我试图用i getter / setter做的是设置这样的元素:

var index = 5;
list.i(index) = node;

但当然,这不起作用,因为:

  1. i不是函数;
  2. 显然,我无法将变量赋值给函数。
  3. 我当然可以使用一个函数来设置元素:

    list.setAtIndex(index, node);
    

    但我更喜欢以某种方式覆盖对象的数组表示法。

    所以,我的问题是,这可能吗?如果是这样,我可以得到一些提示吗? 我的搜索尝试只返回了资源like this,我知道getter / setter现在是如何工作的。

3 个答案:

答案 0 :(得分:3)

我想建议这是一个非常糟糕的主意。在索引 i 获取链接列表的项目的成本是 O(n)。通过索引访问链表是Java所犯的错误,其他人不应该重复。这个错误不适用于C ++和C#。

在大多数情况下,数组通常更适合随机插入和删除,因为线性搜索的 O(n)成本在性能方面完全占主导地位,并且数组更适合预取。不,真的:http://bulldozer00.com/2012/02/09/vectors-and-lists/

我建议使用一个没有索引访问权限的链表实现,因为你可以真正证明你可以通过使用链表来获得性能优势,也许是为了实现一个队列。我建议在所有其他情况下使用内置数组。除了在大多数情况下总体上更好之外,对于内置数组,您将获得比对任何第三方链接列表实现更优化的好处。

答案 1 :(得分:3)

除了这是一个坏主意,它根本不可能。

答案 2 :(得分:-1)

我不知道你是否愿意这样,但请看看

codepen.io ex

我认为它还不完全令人满意,因为它默认说在提供参数时,您想要访问set