JavaScript|JavaScript — 对象的数据属性和访问器属性

  1. 数据属性
  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true;若把configurable 设置为false,则表示不能从对象中删除属性,且不能再变回可配置的了,此时再调用Object.defineProperty() 修改除writable之外的特性都会导致错误
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性
  • [[Writable]]:表示能否修改属性的值
  • [[Value]]:包含这个属性的数据值
Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)`用来修改属性默认的特性
var person = {}; Object.defineProperty(person, "name", { writable: false, value: "Nicholas" }); console.log(person.name); //"Nicholas" person.name = "Greg"; console.log(person.name); //"Nicholas"

  1. 访问器属性
  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性
  • [[Get]]:在读取属性时调用的函数,默认值为 undefined
  • [[Set]]:在写入属性时调用的函数,默认值为 undefined
var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return this._year; }, set: function(newValue){if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; }} }); book.year = 2005; console.log(book.edition); //2

Object.defineProperties()定义多个属性
var book = {}; Object.defineProperties(book, _year: { value: 2004 }, edition: { value: 1 }, year: { get: function(){ return this._year; }, set: function(newValue){if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; }} });

【JavaScript|JavaScript — 对象的数据属性和访问器属性】Object.getOwnPropertyDescriptor()读取属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); console.log(descriptor.value); //2004 console.log(descriptor.configurable); //false console.log(typeof descriptor.get); //"undefined"var descriptor = Object.getOwnPropertyDescriptor(book, "year"); console.log(descriptor.value); //"undefined" console.log(descriptor.enumerable); //false console.log(typeof descriptor.get); //"function"

    推荐阅读