【问题标题】:List All Prototype Properties of a Javascript Object列出 Javascript 对象的所有原型属性
【发布时间】:2015-07-21 10:00:34
【问题描述】:

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    不是原型方法,但您可以使用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]});
    • @BassemDy 一方面,.__proto__Object.getPrototypeOf 类似,但已被弃用并且在少数极端情况下不起作用。此外,仅访问原型链的一级可能无法获得所有属性。顺便说一句,OP 似乎对属性名称而不是值感兴趣,所以你可以省略 .map(…)
    【解决方案2】:
    function prototypeProperties(obj) {
      var result = [];
      for (var prop in obj) {
        if (!obj.hasOwnProperty(prop)) {
          result.push(prop);
        }
      }
      return result;
    }
    

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

    【讨论】:

    • 请注意,这只会打印 enumerable 属性,而接受的答案将打印 all 属性,无论是否可枚举。
    猜你喜欢
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多