JavaScript自省已完成
初学者JavaScript问题。我对Python中的JavaScript自省已完成,javascript,node.js,introspection,Javascript,Node.js,Introspection,初学者JavaScript问题。我对Python中的dir内置函数有些着迷。我想发现node.js REPL中任何对象的属性/方法。我已经看到了;在空数组[]的简单情况下,接受的答案将失败(在节点中)。例如: for(var prop in []){console.log(prop);} # returns undefined, prints nothing [].length # returns 0 因为循环没有发现数组的代码>长度>代码>方法,我不认为这是正确的内省。所以,有人能在这里
dir
内置函数有些着迷。我想发现node.js REPL中任何对象的属性/方法。我已经看到了;在空数组[]
的简单情况下,接受的答案将失败(在节点中)。例如:
for(var prop in []){console.log(prop);} # returns undefined, prints nothing
[].length # returns 0
<>因为<<代码> < /代码>循环没有发现数组的<>代码>长度>代码>方法,我不认为这是正确的内省。所以,有人能在这里填空吗?
function magic(some_object) {
# magic goes here
}
console.log(magic([])) # should print a list that includes 'length'
或者这仅仅是不可能的,或者只对“用户类型”可能吗?您需要在浏览器兼容性方面走多远?所有现代浏览器都应该支持Object.getOwnPropertyNames()
。使用您的示例,Object.getOwnPropertyNames([])
将返回[“length”]
更多信息请点击此处:
编辑:其他示例:
Object.getOwnPropertyNames([1,2,3])代码>返回[“0”、“1”、“2”、“长度”]
Object.getOwnPropertyNames(字符串)代码>返回[“原型”、“引号”、“子字符串”、“toLowerCase”、“toUpperCase”、“charAt”、“charCodeAt”、“包含”、“indexOf”、“lastIndexOf”、“StartWith”、“endsWith”、“trim”、“trimLeft”、“trimRight”、“toLowerCase”、“toLowerCase”、“localeCompare”、“match”、“search”、“replace”、“split”、“substr”、“concat”、“slice”、“fromCharCode”,“长度”、“名称”、“参数”、“调用方”]
编辑#2:好的,鉴于您正在寻找完整的属性和方法列表,包括继承的属性和方法,我借用了其他两个so问题(链接如下),并提出了一个解决方案,似乎可以让您更接近:
var findProperties = function(obj) {
var aPropertiesAndMethods = [];
do {
aPropertiesAndMethods = aPropertiesAndMethods.concat(Object.getOwnPropertyNames(obj));
} while (obj = Object.getPrototypeOf(obj));
for ( var a = 0; a < aPropertiesAndMethods.length; ++a) {
for ( var b = a + 1; b < aPropertiesAndMethods.length; ++b) {
if (aPropertiesAndMethods[a] === aPropertiesAndMethods[b]) {
aPropertiesAndMethods.splice(a--, 1);
}
}
}
return aPropertiesAndMethods;
}
var findProperties=函数(obj){
var aProperties and Methods=[];
做{
aPropertiesAndMethods=aPropertiesAndMethods.concat(Object.getOwnPropertyNames(obj));
}while(obj=Object.getPrototypeOf(obj));
对于(var a=0;a
因此,如果您使用callfindProperties([])
,它将返回[“长度”、“连接”、“反转”、“排序”、“推”、“弹出”、“移位”、“取消移位”、“拼接”、“concat”、“切片”、“lastIndexOf”、“indexOf”、“forEach”、“map”、“reduce”、“reduceRight”、“filter”、“some”、“every”、“迭代器”、“构造函数”、“toSource”、“toString”、“toLocaleString”、“valueOf”,“watch”,“unwatch”,“hasOwnProperty”,“isPrototypeOf”,“propertyIsEnumerable”,“\uuuu defineGetter\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
链接问题
您可以在REPL FYI中使用tab completion,它可以很好地查看大多数内容,但完整回答您的问题相当复杂。大多数情况下,你想要的东西是可以实现的,但这需要相当多的技巧util.inspect
和console.log
在节点中也很方便,我编写了自己的util.inspect
实现,一旦我找到答案,如果当时还没有被接受,我就会发布它。嗯,我在节点中
不是浏览器,但这是正确的方向。但还是没有给我一切Object.getOwnPropertyNames([])
返回['length']
,尽管空数组也有.toString()
方法。和Object.getOwnPropertyNames(数组)
提供了更多的方法(包括prototype
),但仍然没有toString
。您获得了我的upvote,但如果可以,我仍然希望通过编程获得所有有效的属性/方法。好的,那么您不仅要查找实际对象的属性和方法,还要查找它继承的属性和方法?因为从技术上讲,toString
是一种Object.prototype
的方法,它只是由Array
继承的。不确定是否有任何方法也可以获取继承的方法和属性。啊哈,我想我在这里学习。这样我就可以编写一个函数,沿着继承树一直到对象
,然后构建一组它找到的所有东西?我看不出一个明显的方法来做到这一点Object.getPrototypeOf([])
只返回[]
而不是Array
。当你输入时,我正在写这个函数D特别感谢我链接的两个线程中的一些答案,它们为我指明了正确的方向。如果将2
设置为定义的Number
对象(即console.log(findProperties(新编号(2));
),则可以获得的返回。有趣的是,它给出的结果不同于console.log(findProperties(Number))代码>,显示对象(例如,Number
)和对象实例(例如,2
)之间的差异。