【问题标题】:Override a object's bracket [index] getter/setter in JavaScript?在 JavaScript 中覆盖对象的括号 [index] getter/setter?
【发布时间】:2012-12-13 11:59:46
【问题描述】:

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

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

但是,我不能只使用这种语法,因为从技术上讲,节点不是列表的属性。
将列表视为 2 个钩子。这 2 个钩子连接到链的 2 个末端,但您只能访问这 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. 显然,我无法将变量分配给函数。

我当然可以只使用一个函数来设置元素:

list.setAtIndex(index, node);

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

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

【问题讨论】:

标签: javascript object getter-setter


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我不知道你是否喜欢这个,但请看一下

      codepen.io ex

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

      【讨论】:

      • 不要粗鲁,但这并不是我真正想要的。我无法在不覆盖函数的情况下设置长度(list.length = 5),也无法将list[index] 设置为某个node。不过,你确实让我知道了如何做到这一点。
      • 对,因为属性的东西没有了,而是变成了一个get/set函数。很公平,没问题大声笑
      • 我很高兴,我曾经想做它,但我想,为什么要付出额外的努力......:D
      猜你喜欢
      • 2011-03-11
      • 2013-11-11
      • 2018-11-08
      • 2014-11-12
      • 1970-01-01
      • 2015-05-11
      相关资源
      最近更新 更多