【问题标题】:Extending map objects扩展地图对象
【发布时间】:2009-03-24 20:46:25
【问题描述】:

我不知道如何用原型扩展地图对象,希望你能帮忙。 我有这样的事情:

var map = {'one':1, 'two':2};

我想要一种方法来检查密钥是否存在:

if (map.containsKey('one')){...}

如何扩展地图对象?

【问题讨论】:

    标签: javascript dictionary prototype extend


    【解决方案1】:

    修改 Object.prototype 很危险,因为it affects all objects and will usually break other libraries you may be using。一般来说,如果你想为类字典对象添加方法,你应该为你的哈希实例创建一个对象来继承,like the Prototype Hash object

    对于这个特定的例子,你真的应该只使用if (key in map)if (map.hasOwnProperty(key))

    【讨论】:

      【解决方案2】:

      已经有一个运算符来测试对象内部是否存在键。

      (在 JavaScript 中,对象被实现为地图,因此实际上没有真正的地图。)

      if( 'one' in map ) 
      {
         alert(map['one']);
      }
      

      【讨论】:

        【解决方案3】:

        这些不是“地图”,它们是对象。基于 Maurice 的回答,如果您希望这适用于所有对象:

        Object.prototype.containsKey = function(key) {
            return this.hasOwnProperty(key);
        };
        

        【讨论】:

        • 或者你可以只使用 hasOwnProperty 这样 map.containsKey('containsKey') 并不总是返回 true! :p
        • 不!不理会 Object.prototype。
        • 我认为 Chetan 想告诉您的是,将 hasOwnProperty() 重命名为 containsKey() 没有多大意义,并且您的解决方案可能会破坏使用 in 的代码,而应该使用 @987654325 @
        【解决方案4】:

        最简单的方法是直接在对象中添加一个函数:

        map.containsKey = function(key) {
            return this[key] ? true : false;
        };
        

        【讨论】:

        • 很好,现在可以使用。如果我有多个地图实例,如何将其概括为工作?
        • @Haoest:由于您使用常规 Javascript 对象作为地图,因此 Object 已经具有函数 hasOwnProperty。
        • 这不会检查属性的存在,但它是布尔上下文中的值;此外,它有点难看:使用 return Boolean(this[key])return !!this[key] 转换为布尔值
        【解决方案5】:

        在Javascript中,你真的不需要这样的方法。

        if ( map['one'] ) {
           // do something
        }
        

        应该这样做

        【讨论】:

        • 除非 'one' 被定义并且是假的。或者如果“one”是从对象的原型派生的,而不是它自己的属性。
        【解决方案6】:

        正如其他人所说,如果您的代码必须与不了解 hasOwnProperty() 的人编写的代码兼容,那么扩展 Object.prototype 可能不是一个好主意。

        无论如何,我知道有三种“正确”的方法来检查属性是否可用:

        obj.hasOwnProperty(name)
        

        检查对象中是否存在具有给定名称的属性。

        name in obj
        

        还包括通过对象的原型链继承的属性。

        typeof obj[name] !== 'undefined'
        

        如果该属性存在但已设置为undefined,则将另外评估为false

        某些非 JS 对象(例如 IE 中的 window.external)可能无法实现 hasOwnProperty(),因此必须使用其他检查之一。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-18
          • 2017-11-21
          • 2021-06-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多