interview
advanced-javascript-frontend
JavaScript 如何获得对象非原型链上的属性

前端 JavaScript 进阶面试题, JavaScript 如何获得对象非原型链上的属性?

前端 JavaScript 进阶面试题, JavaScript 如何获得对象非原型链上的属性?

QA

Step 1

Q:: JavaScript 如何获得对象非原型链上的属性?

A:: 可以使用 Object.keys()、Object.getOwnPropertyNames()、Object.getOwnPropertySymbols() 或者 Reflect.ownKeys() 来获取对象自身的属性(不包括原型链上的属性)。这些方法会返回对象自身的可枚举属性(Object.keys())或所有属性(Object.getOwnPropertyNames() 和 Reflect.ownKeys())。例如:

 
let obj = {a: 1, b: 2};
Object.keys(obj); // ['a', 'b']
Object.getOwnPropertyNames(obj); // ['a', 'b']
Reflect.ownKeys(obj); // ['a', 'b']
 

Step 2

Q:: Object.keys() 和 Object.getOwnPropertyNames() 有什么区别?

A:: Object.keys() 返回一个由对象自身的可枚举属性组成的数组,而 Object.getOwnPropertyNames() 返回一个由对象自身的所有属性(包括不可枚举属性)组成的数组。

Step 3

Q:: 如何判断对象是否具有某个自身属性?

A:: 可以使用 Object.hasOwnProperty() 方法来判断对象是否具有某个自身属性。例如:

 
let obj = {a: 1};
obj.hasOwnProperty('a'); // true
obj.hasOwnProperty('b'); // false
 

用途

面试这个内容是为了考察候选人对 JavaScript 对象模型的理解,尤其是原型链的概念。在实际生产环境中,开发人员经常需要操作对象的属性,例如深拷贝、对象合并、属性遍历等,这些都需要深入理解对象的属性操作方法。\n

相关问题

🦆
如何遍历对象的所有属性,包括原型链上的属性?

可以使用 for...in 循环遍历对象的所有可枚举属性,包括原型链上的属性。需要注意的是,为了避免遍历到原型链上的属性,可以使用 hasOwnProperty() 方法进行过滤。例如:

 
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key);
  }
}
 
🦆
如何深拷贝一个对象?

可以使用递归的方法或者使用 JSON.parse(JSON.stringify()) 来深拷贝一个对象,但后者不能拷贝函数和 undefined。更为全面的方法是使用库如 lodash 的 _.cloneDeep()。例如:

 
let obj = {a: 1, b: {c: 2}};
let deepClone = JSON.parse(JSON.stringify(obj));
 
🦆
Object.defineProperty 的作用是什么?

Object.defineProperty() 用于直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。通过这个方法可以定义或修改属性的特性,例如可枚举性、可配置性和可写性。例如:

 
let obj = {};
Object.defineProperty(obj, 'a', {
  value: 1,
  writable: true,
  enumerable: true,
  configurable: true
});
 
🦆
什么是 JavaScript 的原型链?

JavaScript 的原型链是实现继承的机制。每个对象都有一个内部链接到另一个对象的引用,这个被引用的对象称为“原型”。对象从它的原型继承属性和方法,这个过程会一直延续下去,形成一个链条,称为原型链。例如:

 
function Person(name) {
  this.name = name;
}
Person.prototype.getName = function() {
  return this.name;
};
let person = new Person('Alice');
person.getName(); // 'Alice'