所以最近我必须检查用户是否安装了某个插件,这显然很容易完成:
if(typeof navigator.plugins['plugin name'] === 'undefined'){
alert('Please install plugin')
}
这对我来说并不令人惊讶,我认为它只是访问了分配给plugin name
对象的plugins
的对象。 (如plugins['plugin name'] = {...}
)
奇怪的是,如果console.log
变量为navigator.plugins
,它就会出现:
>PluginArray
>0: Plugin
>1: Plugin
>2: Plugin
因此,可以使用navigotor.plugins['Plugin name']
和navigator.plugins[i]
访问这些插件对象!
我的问题是,我怎样才能实现类似的东西,所以我可以通过索引(简单迭代和保留数组功能)和所述对象的属性(通过id或名称轻松访问)来访问数组的对象? / p>
navigator.plugins对象有PluginArray
原型,所以我想这个类以某种方式覆盖obj['index']
访问器并查找具有给定索引的对象(s?)作为&# 39;名称'属性,通过访问时迭代,维护将数字索引映射到名称的内部数组([i] ='索引')或将名称映射到其索引的内部对象(.index = i)
关于最佳方法的任何想法?
编辑:正如Oriol指出的那样,您可以为两个键(arr[0] = arr[obj.name] = obj
)分配相同的对象,如果obj.name是唯一的,这可以很好地工作 ,如果不是你冒险覆盖之前设置的密钥。如果你想使用像唯一数据库索引这样的东西作为第二把钥匙,那绝对是一种便宜而简单的解决方案。
答案 0 :(得分:2)
您可以为多个属性分配相同的值:
var obj = {};
obj[0] = obj.name0 = value0;
obj[1] = obj.name1 = value1;
obj[2] = obj.name2 = value2;
答案 1 :(得分:1)
这与DOM集合实现的行为相同;在内部,如果传递的密钥是一个int转发它到.item()
,如果它的字符串将其转发到.namedItem()
。
您目前最接近的是ES6 Proxy()
支持非常有限;
"use strict";
let Plugins = new Proxy(
[{name: 'pdf', mime: 'pfft/pdf'}, {name: 'swf', type: 'flash'}],
{
get: function(obj, prop)
{
if (!isNaN(prop)) // by index
return obj[prop]
for (var k in obj) // lookup a name
if (obj[k].name == prop)
return obj[k];
}
});
console.log(Plugins); // Array [ Object, Object ]
console.log(Plugins[0]); // Object { name: "pdf", type: "doc" }
console.log(Plugins['pdf']); // Object { name: "pdf", type: "doc" }
答案 2 :(得分:0)
数组是最基本的,使用魔法length
键扩展的对象 - 您可以为其添加任何键值。如果你想看到键,迭代它会变得稍微复杂一些,设置任何可以等于数字的东西(即arr["1"]
)将等同于设置数组的数字索引。
答案 3 :(得分:0)
navigator.plugins
有一个原型PluginArray
,它链接到将插件名称转换为数组中条目的本机代码。
使用console.log(navigator.plugins.__proto__)
查看此内容。