读书笔记:JavaScript——理解对象属性

一、属性类型
1、数据属性
1)数据属性包括4个描述其行为的特性:

  • configurable:可配置的,直接在对象上定义的属性,它的可配置特性默认为true
  • enumerable:可枚举的,直接在对象上定义的属性,它的可配置特性默认为true
  • writable:可写的,直接在对象上定义的属性,它的可配置特性默认为true
  • value:数据值,默认值为undefined

2)可使用Object.defineProperty()方法定义或修改属性特性
接收3个参数:属性所在对象、属性名、一个描述符对象(只能设置上述4个特性)

const person = {}
Object.defineProperty (person, 'name', {
	writable: false,//设置该属性为只读
	configurable: false,//设置属性不可配置
	value: 'diana'
})
console.log(person.name)//diana:value值
person.name = 'js'
console.log(person.name)//diana:不可写
delete person.name
console.log(person.name)//diana:不可配置

一旦把属性定义为不可配置的,就无法再变回可配置的了:

Object.defineProperty (person, 'name', {
	configurable: true
})//报错:Cannot redefine property: name

注意:当使用Object.defineProperty()方法创建一个属性,该属性的数据属性默认都是false

2、访问器属性

  • configurable:可配置的,,直接在对象上定义的属性,它的可配置特性默认为true
  • enumerable:可枚举的,直接在对象上定义的属性,它的可配置特性默认为true
  • get:读取属性时调用的get()函数,默认值为undefined
  • set:读取属性时调用的set()函数,默认值为undefined

访问器属性不能直接定义,必须使用Object.defineProperty()方法定义:

const book = {
	_year: 2004,
	edition: 1
}
Object.defineProperty(book, 'year', {
	get: function() {
		return this._year
	},
	set: function(newVal) {
		if (newVal > 2004) {
			this._year = newVal
			this.edition += (newVal - 2004)
		}
	}
})
console.log(book.year)//2004:调用访问器属性year的get函数
book.year = 2008//调用访问器属性year的set函数并传入参数2008
console.log(book.edition)//5

二、定义多个属性
使用Object.defineProperties()方法,接收2个参数:要修改/添加的对象、与被修改/添加对象的属性一一对应的第二个对象

const book = {}
Object.defineProperties(book, {
	_year: {//数据属性
		writable: true,
		value: 2004
	},
	edition: {//数据属性
		writable: true,
		value: 1
	},
	year: {//访问器属性
		get: function () {//getter函数
			return this._year
		},
		set: function (newVal) {//setter函数
			if (newVal > 2004) {
				this._year = newVal
				this.edition += newVal - 2004
			}
		}
	}
})
console.log(book.year)//2004
book.year=2006
console.log(book.edition)//3

三、读取属性的特性
使用Object.getOwnPropertyDescriptor()方法,接收2个参数:属性所在对象、属性名

const book = {}
Object.defineProperties(book, {
	_year: {//数据属性
		writable: true,
		value: 2004
	},
	edition: {//数据属性
		writable: true,
		value: 1
	},
	year: {//访问器属性
		get: function () {//getter函数
			return this._year
		},
		set: function (newVal) {//setter函数
			if (newVal > 2004) {
				this._year = newVal
				this.edition += newVal - 2004
			}
		}
	}
})

// 读取数据属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, '_year')
console.log(descriptor.value)//2004
console.log(descriptor.writable)//true
console.log(descriptor.enumerable)//false
console.log(descriptor.configurable)//false
console.log(typeof descriptor.get)//undefined

// 读取访问器属性的特性
var descriptor = Object.getOwnPropertyDescriptor(book, 'year')
console.log(descriptor.value)//undefined
console.log(typeof descriptor.get)//function
console.log(typeof descriptor.set)//function
console.log(descriptor.configurable)//false
console.log(descriptor.enumerable)//false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值