【发布时间】:2009-03-24 20:46:25
【问题描述】:
我不知道如何用原型扩展地图对象,希望你能帮忙。 我有这样的事情:
var map = {'one':1, 'two':2};
我想要一种方法来检查密钥是否存在:
if (map.containsKey('one')){...}
如何扩展地图对象?
【问题讨论】:
标签: javascript dictionary prototype extend
我不知道如何用原型扩展地图对象,希望你能帮忙。 我有这样的事情:
var map = {'one':1, 'two':2};
我想要一种方法来检查密钥是否存在:
if (map.containsKey('one')){...}
如何扩展地图对象?
【问题讨论】:
标签: javascript dictionary prototype extend
修改 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))。
【讨论】:
已经有一个运算符来测试对象内部是否存在键。
(在 JavaScript 中,对象被实现为地图,因此实际上没有真正的地图。)
if( 'one' in map )
{
alert(map['one']);
}
【讨论】:
这些不是“地图”,它们是对象。基于 Maurice 的回答,如果您希望这适用于所有对象:
Object.prototype.containsKey = function(key) {
return this.hasOwnProperty(key);
};
【讨论】:
hasOwnProperty() 重命名为 containsKey() 没有多大意义,并且您的解决方案可能会破坏使用 in 的代码,而应该使用 @987654325 @
最简单的方法是直接在对象中添加一个函数:
map.containsKey = function(key) {
return this[key] ? true : false;
};
【讨论】:
return Boolean(this[key]) 或 return !!this[key] 转换为布尔值
在Javascript中,你真的不需要这样的方法。
if ( map['one'] ) {
// do something
}
应该这样做
【讨论】:
正如其他人所说,如果您的代码必须与不了解 hasOwnProperty() 的人编写的代码兼容,那么扩展 Object.prototype 可能不是一个好主意。
无论如何,我知道有三种“正确”的方法来检查属性是否可用:
obj.hasOwnProperty(name)
检查对象中是否存在具有给定名称的属性。
name in obj
还包括通过对象的原型链继承的属性。
typeof obj[name] !== 'undefined'
如果该属性存在但已设置为undefined,则将另外评估为false。
某些非 JS 对象(例如 IE 中的 window.external)可能无法实现 hasOwnProperty(),因此必须使用其他检查之一。
【讨论】: