Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript自省已完成_Javascript_Node.js_Introspection - Fatal编程技术网

JavaScript自省已完成

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 因为循环没有发现数组的代码>长度>代码>方法,我不认为这是正确的内省。所以,有人能在这里

初学者JavaScript问题。我对Python中的
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
因此,如果您使用call
findProperties([])
,它将返回
[“长度”、“连接”、“反转”、“排序”、“推”、“弹出”、“移位”、“取消移位”、“拼接”、“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
)之间的差异。