【问题标题】:How to create a Javascript Hash Table / Associate Array Prototype如何创建 Javascript 哈希表/关联数组原型
【发布时间】:2015-05-30 16:50:43
【问题描述】:

带有关联数组如:

var m = {};
m['a'] = {id:1, foo:'bar'};
m['b'] = {id:2, foo:'bar'};

是否可以创建原型如:

Array.prototype.hello = function() { console.log('hello'); }
m.hello();

这失败了,因为m是一个对象,所以我累了:

Object.prototype.hello = function() { console.log('hello'); }

这也是有问题的。

是否有可能创建一个可以对该数据结构进行操作的原型?


更新: 我想我需要睡觉了:)

当我自己创建和使用Object.prototype.hello = function() { console.log('hello'); } 时,它工作正常。

当我添加原型并包含第 3 方 JS 框架时,它会使框架停止工作。

【问题讨论】:

    标签: javascript prototype associative-array


    【解决方案1】:

    为什么不创建自己的对象构造函数,以便可以毫无问题地扩展其原型?

    function O(o) {
        for (var p in o) {
            this[p] = o[p];
        }
    }
    
    O.prototype.hello = function() { console.log('hello') }
    

    然后将构造函数与您的对象文字一起使用。

    var m = new O({})
    m['a'] = {id:1, foo:'bar'}
    m['b'] = {id:2, foo:'bar'}
    

    如果你愿意,有一些技巧可以让你放弃new

    【讨论】:

      【解决方案2】:

      您可以将自定义属性分配给任何对象,这意味着您可以对具有与Object.prototype 不同的直接底层原型的对象执行此操作。所以你可以这样做,例如:

      function MyMap() {
      }
      MyMap.prototype.hello = function() {
          console.log('hello');
      };
      var m = new MyMap();
      m['a'] = {id:1, foo:'bar'};
      m['b'] = {id:2, foo:'bar'};
      m.hello();
      

      注意,不过,如果您存储了 hello 条目:

      m['hello'] = {id:3, foo:'bar'};
      

      ...它将隐藏您的对象从原型中获取的hello

      另请注意,您的m 不仅具有来自MyMap.prototype 的属性,还具有来自Object.prototype 的属性(如{} 所具有的),如toStringvalueOfhasOwnProperty。如果你想拥有Objectproperties,你也可以这样做:

      function MyMap() {
      }
      MyMap.prototype = Object.create(null);
      MyMap.prototype.hello = function() {
          console.log('hello');
      };
      

      还要注意构造函数(MyMap,上面)只是创建具有底层原型的对象的一种方法。你可以直接使用Object.create

      var mapPrototype = {
          hello: function() {
              console.log('hello');
          }
      };
      var m = Object.create(mapPrototype);
      

      【讨论】:

      • 我将尝试您的最后一个建议。感谢您的帮助。
      • @BrianMcGinity:不用担心。请注意,它具有与所有其他人相同的冲突问题。 :-) 解决冲突问题的唯一方法是将条目存储在不同的对象上,就像 ES6 的 map 在概念上所做的那样。
      【解决方案3】:

      您可以使用Object.create 为您的结构创建一个类似数组的原型。

      var proto = Object.create(Array.prototype);
      proto.hello = function() { console.log('hello'); }
      

      然后像这样使用它

      var stack = Object.create(proto);
      stack.hello();
      stack.push('example');
      

      【讨论】:

        【解决方案4】:

        分配给 Object.prototype 应该可以正常工作。在节点中运行时:

        > Object.prototype.foo = function() { console.log("foo!"); }
        [Function]
        > var m = {};
        undefined
        > m.foo();
        foo!
        undefined
        

        这是否是一个好主意是另一个讨论......

        【讨论】:

          猜你喜欢
          • 2012-09-02
          • 1970-01-01
          • 2011-05-11
          • 2011-03-09
          • 1970-01-01
          • 2017-01-13
          • 2011-04-20
          • 1970-01-01
          • 2010-11-21
          相关资源
          最近更新 更多