列出一个Javascript对象的所有原型属性。

35

有没有其他方法可以查找JavaScript对象的原型属性。比方说,我有这样一个对象。

function proton() {
    this.property1 = undefined;
    this.property2 = undefined;
};

proton.prototype = {

    sample1 : function() {
        return 'something';
    },

    sample2 : function() {
        return 'something';
    }

};

var my_object = new proton();

console.log(Object.keys(my_object));

返回 ["property1", "property2"]

console.log(Object.getOwnPropertyNames(my_object));

返回 ["property1", "property2"]

但我想要打印的是对象 my_object 的原型属性。

['sample1', 'sample2']

为了查看该对象的原型属性,我需要 console.log(object),然后从开发者工具中查找该对象的属性。

但由于我正在使用像 phaser.js、react.js 和 create.js 这样的第三方库,因此我不知道从这些库创建的对象的原型属性列表。

是否有 Object 的原型函数可以列出 JavaScript 对象的所有原型属性?

4个回答

68

虽然不是原型方法,但你可以使用Object.getPrototypeOf来遍历原型链,然后获取每个对象的自有属性名称。

function logAllProperties(obj) {
     if (obj == null) return; // recursive approach
     console.log(Object.getOwnPropertyNames(obj));
     logAllProperties(Object.getPrototypeOf(obj));
}
logAllProperties(my_object);

使用这个功能,您还可以编写一个返回所有属性名称数组的函数:

function props(obj) {
    var p = [];
    for (; obj != null; obj = Object.getPrototypeOf(obj)) {
        var op = Object.getOwnPropertyNames(obj);
        for (var i=0; i<op.length; i++)
            if (p.indexOf(op[i]) == -1)
                 p.push(op[i]);
    }
    return p;
}
console.log(props(my_object)); // ["property1", "property2", "sample1", "sample2", "constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable"

1
作为非 JS 大师,有没有任何原因说明访问 __proto__ 并将其转换为数组是一个不好的主意?例如:var arr = Object.keys(my_object.__proto__).map(function (key) {return my_object.__proto__[key]}); - Bassem
3
@BassemDy 首先,.__proto__Object.getPrototypeOf类似,但已被弃用,在某些边缘情况下不起作用。此外,仅访问原型链的一个级别可能无法获取所有属性。顺便说一句,OP似乎对属性名称而非值感兴趣,因此可以省略.map(…) - Bergi

11
function prototypeProperties(obj) {
  var result = [];
  for (var prop in obj) {
    if (!obj.hasOwnProperty(prop)) {
      result.push(prop);
    }
  }
  return result;
}

编辑:这将获取在任何祖先上定义的所有属性。如果您想更精细地控制在哪里定义了什么,Bergi的建议很好。


4
请注意,这将仅打印可枚举属性,而被接受的答案将打印所有属性,无论是否可枚举。 - Ohad Schneider

3

一个快速而简单的解决方案是:

console.log(Object.getOwnPropertyNames(Object.getPrototypeOf({ prop1: 'val1' })))

如果您想要更精确的内容,请参考被接受的答案!


0
如果你想列出对象的所有原型属性。
let obj = {prop1:"", method(){}}
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(obj)))
// (12) ['constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 'valueOf', '__proto__', 'toLocaleString']

如果你想要包括对象自身属性在内的所有属性。
[ ...Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ), ...Object.getOwnPropertyNames(obj) ]

// (14) ['constructor', '__defineGetter__', '__defineSetter__', 'hasOwnProperty', '__lookupGetter__', '__lookupSetter__', 'isPrototypeOf', 'propertyIsEnumerable', 'toString', 'valueOf', '__proto__', 'toLocaleString', 'prop1', 'method']

仅返回对象自身的属性。

Object.getOwnPropertyNames(obj)
// (2) ['prop1', 'method']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接