JavaScript的数据对象有哪些属性值

87 阅读3分钟

JavaScript的数据对象有哪些属性值

在 JavaScript 中,数据对象(如普通对象、数组、函数等)具有多种属性值,这些属性值可以分为以下几类:

1. 自有属性(Own Properties)

自有属性是直接定义在对象上的属性,而非通过原型链继承的属性。

(1) 数据属性

  • :属性的实际值。
  • 特性(Attributes)
    • value:属性的值。
    • writable:是否可修改。
    • enumerable:是否可枚举(如 for...inObject.keys())。
    • configurable:是否可删除或修改特性。

(2) 访问器属性

  • 特性
    • get:获取属性值的函数。
    • set:设置属性值的函数。
    • enumerableconfigurable:同上。

(3) 示例

const obj = {
  name: '张三', // 数据属性
  get age() { return 30; }, // 访问器属性
  set age(value) { console.log('设置年龄:', value); }
};

console.log(obj.name); // 输出:张三
console.log(obj.age);  // 输出:30
obj.age = 40;          // 输出:设置年龄:40

2. 继承属性(Inherited Properties)

继承属性是通过原型链从原型对象继承的属性。

(1) 示例

const parent = {
  greet() {
    console.log('你好!');
  }
};

const child = Object.create(parent);
child.greet(); // 输出:你好!(继承自 parent)

3. 内置属性(Internal Properties)

内置属性是 JavaScript 引擎内部使用的属性,通常不可直接访问。

(1) 示例

  • [[Prototype]]:对象的原型(通过 __proto__Object.getPrototypeOf() 访问)。
  • [[Class]]:对象的内部分类(如 [object Object])。

4. 特殊属性

(1) length

  • 数组:表示数组的长度。
    const arr = [1, 2, 3];
    console.log(arr.length); // 输出:3
    
  • 函数:表示函数的参数个数。
    function fn(a, b) {}
    console.log(fn.length); // 输出:2
    

(2) prototype

  • 函数:指向函数的原型对象,用于实现基于原型的继承。
    function Person() {}
    console.log(Person.prototype); // 输出:Person {}
    

(3) __proto__

  • 对象:指向对象的原型(非标准,推荐使用 Object.getPrototypeOf())。
    const obj = {};
    console.log(obj.__proto__ === Object.prototype); // 输出:true
    

5. 属性的描述符(Property Descriptor)

通过 Object.getOwnPropertyDescriptor() 获取属性的描述符。

(1) 示例

const obj = { name: '张三' };
const descriptor = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(descriptor);
// 输出:
// {
//   value: '张三',
//   writable: true,
//   enumerable: true,
//   configurable: true
// }

(2) 修改属性描述符

使用 Object.defineProperty()Object.defineProperties()

Object.defineProperty(obj, 'name', {
  writable: false
});
obj.name = '李四'; // 静默失败(严格模式下报错)
console.log(obj.name); // 输出:张三

6. 属性的枚举与遍历

(1) for...in

  • 遍历对象及其原型链上的可枚举属性。
    const obj = { a: 1, b: 2 };
    for (const key in obj) {
      console.log(key); // 输出:a, b
    }
    

(2) Object.keys()

  • 返回对象自身的可枚举属性数组。
    console.log(Object.keys(obj)); // 输出:['a', 'b']
    

(3) Object.getOwnPropertyNames()

  • 返回对象自身的所有属性(包括不可枚举属性)。
    console.log(Object.getOwnPropertyNames(obj)); // 输出:['a', 'b']
    

(4) Object.values()Object.entries()

  • 返回对象自身的值或键值对数组。
    console.log(Object.values(obj)); // 输出:[1, 2]
    console.log(Object.entries(obj)); // 输出:[['a', 1], ['b', 2]]
    

7. 属性的存在性检查

(1) in 操作符

  • 检查属性是否在对象或其原型链上。
    console.log('a' in obj); // 输出:true
    

(2) hasOwnProperty()

  • 检查属性是否为对象自身的属性。
    console.log(obj.hasOwnProperty('a')); // 输出:true
    

总结

属性类型描述示例方法
自有属性直接定义在对象上的属性Object.getOwnPropertyDescriptor
继承属性通过原型链继承的属性for...in
内置属性引擎内部使用的属性[[Prototype]]
特殊属性lengthprototypearr.length
属性描述符描述属性的特性(如可写性、可枚举性)Object.defineProperty

理解这些属性值及其特性,有助于更好地操作和管理 JavaScript 对象。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github