2015-05-05 93 views
0

我必须在构造函数中初始化一个对象集合,并且我想支持所有集合类型,例如数组,地图和集合。 typeof将只返回对象,并且似乎没有通用的Collections实用程序对象,它将提供像Array.isArray()这样的功能。检查对象是否为集合/可迭代的?

来自Java和古典继承风格,我的下一个冲动是检查对象的继承。然而,我对各种原型功能的实验并没有发现任何东西。我能弄清楚的最好方法是创建一个函数,检查地图,设置和阵列的.prototype.isPrototypeOf(object)。但那可能是因为我实际上并没有理解Javascript的原型继承。

有没有更好的方法来检查一个对象是否是一个集合?

回答

0

我想出了下面的技巧,这应该由IE 11和最多支持:

if(typeof collection !== "undefined" && typeof collection.forEach !== "undefined"){ 
    collection.forEach(function(value, param2, collection){ 
    //do stuff 
    }, this); 
} 

param2是每个集合类型不同:对于数组是索引,用于地图这是键和集合重复相同的值以匹配地图和数组的函数签名。

this参数将匿名函数的this分配给外部函数的this - 启用对在外部函数中分配的变量的引用。否则它将默认为全局window

我强烈希望直接测试对象的继承或基于标准的Collections.isCollection类型对象,并将选择一个新的答案。

+0

您应该检查typeof collection ==对象&& typeof collection.forEach ==“函数”'明确地 – Bergi

+1

并且在那里也抛出一个空检查:p – Indolering

+0

使用'collection!= null'而不是'typeof集合!==“undefined”'检查'null'和'undefined'。 –