面试题答案
一键面试- 获取对象所有自身属性:
- 在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);
- 在JavaScript中,可以使用
- 获取对象所有继承属性:
- 可以通过原型链遍历的方式获取对象的继承属性。由于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
仅获取可枚举的自身属性。