JavaScript内省完成

wbe*_*rry 5 javascript introspection node.js

初学JavaScript问题.我对dirPython 的内置函数有点不满.我想发现node.js REPL中任何对象的属性/方法.我已经看过这个问题 ; 在node一个空数组的简单情况下,接受的答案失败(在REPL中)[].例如:

for(var prop in []){console.log(prop);}  # returns undefined, prints nothing
[].length  # returns 0
Run Code Online (Sandbox Code Playgroud)

由于for循环没有发现数组的length方法,我不认为这是适当的内省.那么,有人可以填写空白:

function magic(some_object) {
  # magic goes here
}

console.log(magic([]))  # should print a list that includes 'length'
Run Code Online (Sandbox Code Playgroud)

或者这根本不可能,或者只能用于"用户类型"?

tal*_*myn 8

您需要多长时间才能获得浏览器兼容性?所有现代浏览器都应该支持Object.getOwnPropertyNames().使用您的示例,Object.getOwnPropertyNames([])将返回["length"].

更多信息:https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

编辑:其他例子:

  • Object.getOwnPropertyNames([1, 2, 3]); 回报 ["0", "1", "2", "length"]

  • Object.getOwnPropertyNames(String); 回报 ["prototype", "quote", "substring", "toLowerCase", "toUpperCase", "charAt", "charCodeAt", "contains", "indexOf", "lastIndexOf", "startsWith", "endsWith", "trim", "trimLeft", "trimRight", "toLocaleLowerCase", "toLocaleUpperCase", "localeCompare", "match", "search", "replace", "split", "substr", "concat", "slice", "fromCharCode", "length", "name", "arguments", "caller"]

编辑#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;
}
Run Code Online (Sandbox Code Playgroud)

所以如果你使用call findProperties([]),它会返回["length", "join", "reverse", "sort", "push", "pop", "shift", "unshift", "splice", "concat", "slice", "lastIndexOf", "indexOf", "forEach", "map", "reduce", "reduceRight", "filter", "some", "every", "iterator", "constructor", "toSource", "toString", "toLocaleString", "valueOf", "watch", "unwatch", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "__lookupSetter__"]

相关问题

javascript继承,反射和原型链走?

如何在Javascript中合并两个数组并重复删除项目

  • 好吧,我在`node`而不是浏览器,但这是正确的方向.尽管如此,仍然没有给我一切.`Object.getOwnPropertyNames([])`返回`['length']`,尽管空数组也有`.toString()`方法.而`Object.getOwnPropertyNames(Array)`提供了更多的方法(包括`prototype`),但仍然不是`toString`.你得到了我的upvote,但我仍然希望以编程方式获得*all*属性/方法,如果可以的话. (2认同)
  • 如果你使它成为一个定义的`Number`对象(即`console.log(findProperties(new Number(2)));`),你可以得到'2`的返回值.有趣的是,它给你一个不同于`console.log(findProperties(Number));`的结果,显示了一个对象(例如,`Number`)和一个对象的实例(例如`2`)之间的区别. (2认同)