MST

星途 面试题库

面试题:JavaScript中反射API如何获取对象的所有属性

请简述在JavaScript中,如何使用反射API获取一个对象的所有自身属性和继承属性,并给出代码示例。
31.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 获取对象所有自身属性
    • 在JavaScript中,可以使用Object.getOwnPropertyNames()方法获取对象自身的所有属性(包括不可枚举属性),使用Object.keys()方法获取对象自身的可枚举属性。
    • 代码示例:
    const obj = {
        name: 'John',
        age: 30,
        [Symbol('hidden')]: 'This is a symbol property'
    };
    // 获取自身所有属性(包括不可枚举属性)
    const allOwnPropertyNames = Object.getOwnPropertyNames(obj);
    console.log('所有自身属性(包括不可枚举):', allOwnPropertyNames);
    // 获取自身可枚举属性
    const ownEnumerablePropertyNames = Object.keys(obj);
    console.log('自身可枚举属性:', ownEnumerablePropertyNames);
    
  2. 获取对象所有继承属性
    • 可以通过原型链遍历的方式获取对象的继承属性。由于JavaScript没有像其他语言那样直接获取所有继承属性的内置反射API,我们可以手动实现。
    • 代码示例:
    function getAllProperties(obj) {
        let properties = [];
        while (obj) {
            properties = properties.concat(Object.getOwnPropertyNames(obj));
            obj = Object.getPrototypeOf(obj);
        }
        return properties.filter((value, index, self) => {
            return self.indexOf(value) === index;
        });
    }
    function Animal(name) {
        this.name = name;
    }
    Animal.prototype.speak = function () {
        console.log(`${this.name} makes a sound.`);
    };
    function Dog(name, breed) {
        Animal.call(this, name);
        this.breed = breed;
    }
    Dog.prototype = Object.create(Animal.prototype);
    Dog.prototype.constructor = Dog;
    const myDog = new Dog('Buddy', 'Golden Retriever');
    const allProperties = getAllProperties(myDog);
    console.log('所有属性(包括继承属性):', allProperties);
    

以上代码中,getAllProperties函数通过遍历原型链的方式获取对象的所有属性(包括继承属性),并去除重复属性。Object.getOwnPropertyNames用于获取每个对象自身的所有属性,Object.getPrototypeOf用于获取对象的原型。Object.keys仅获取可枚举的自身属性。