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

IT技术 javascript
2021-03-01 01:50:56

有没有其他方法可以查找 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 的原型属性。

['样品1','样品2']

为了让我看到该对象的原型属性,我需要使用 console.log(object) 并从开发人员工具中查找该对象的属性。

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

是否有 Object 的原型函数来列出 javascript 对象的所有 prototpye 属性?

2个回答

不是原型方法,但您可以使用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"
这里不是 JS 大师,有什么理由访问__proto__它并将其转换为数组是一个坏主意吗?前任:var arr = Object.keys(my_object.__proto__).map(function (key) {return my_object.__proto__[key]});
2021-04-18 01:50:56
@BassemDy 对于其中之一,.__proto__就像Object.getPrototypeOf但已弃用,并且在一些边缘情况下不起作用。此外,仅访问原型链的一级可能无法获得所有属性。顺便说一句,OP似乎对属性名称而不是值感兴趣,因此您可以省略.map(…)
2021-04-19 01:50:56
function prototypeProperties(obj) {
  var result = [];
  for (var prop in obj) {
    if (!obj.hasOwnProperty(prop)) {
      result.push(prop);
    }
  }
  return result;
}

编辑:这将获取在任何祖先上定义的所有属性。如果您想对定义的内容进行更精细的控制,Bergi 的建议很好。

请注意,这只会打印可枚举的属性,而接受的答案将打印所有属性,无论是否可枚举。
2021-05-06 01:50:56