获取任何对象的所有方法?

时间:2017-03-07 20:49:17

标签: javascript

在python单词中有dir()函数

  

返回该对象的有效属性列表

用JS的话说,我发现:

Object.getOwnPropertyNames

Object.keys

但他们没有显示所有属性:

> Object.getOwnPropertyNames([])
[ 'length' ]

如何获取所有属性和方法的列表

concat, entries, every, find.... 
例如

用于Array()?

4 个答案:

答案 0 :(得分:1)

您可以将Object.getOwnPropertyNamesObject.getPrototypeOf一起使用,以遍历原型链并收集每个对象的所有属性。

var result = []
var obj = []
do {
  result.push(...Object.getOwnPropertyNames(obj))
} while ((obj = Object.getPrototypeOf(obj)))

document.querySelector("pre").textContent = result.join("\n")
<pre></pre>

它处理所有属性,无论它们是否被继承或可枚举。但是,这不包括Symbol属性。要包含这些内容,您可以使用Object.getOwnPropertySymbols

var result = []
var obj = []
do {
  result.push(...Object.getOwnPropertyNames(obj), ...Object.getOwnPropertySymbols(obj))
} while ((obj = Object.getPrototypeOf(obj)))

答案 1 :(得分:1)

Object.getOwnPropertyNames(Array.prototype)

尝试以您发布的方式获取值的原因不起作用,原因是您要求Array对象的单个实例的属性名称。出于多种原因,每个实例仅具有与该实例唯一的属性值。由于在Array.prototype中找到的值对于特定实例并不是唯一的 - 这是有意义的,并非所有数组都将共享length的相同值 - 它们将被共享/继承用于所有实例Array

答案 2 :(得分:0)

您可以使用Object.getOwnPropertyNames

  

Object.getOwnPropertyNames() 方法返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组。

console.log(Object.getOwnPropertyNames(Array.prototype));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

此方法将允许您从对象的特定实例中提取所有键和功能(忽略不需要的):

const ROOT_PROTOTYPE = Object.getPrototypeOf({});

function getAllKeys(object) {
    // do not add the keys of the root prototype object
    if (object === ROOT_PROTOTYPE) {
        return [];
    }

    const names = Object.getOwnPropertyNames(object);

    // remove the default constructor for each prototype
    if (names[0] === 'constructor') {
        names.shift();
    }

    // iterate through all the prototypes of this object, until it gets to the root object.
    return names.concat(getAllKeys(Object.getPrototypeOf(object)));
}