前端笔记:面向对象----理解函数

本文深入解析JavaScript对象的概念,探讨对象作为属性集合的本质,介绍数据属性与访问器属性的区别,以及如何使用Object.defineProperty()方法来定制属性行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解对象

对象可以定义为无序属性的集合,其属性包含基本值,对象或者函数。
对象的每个属性或方法都有一个名字,每个名字都映射到一个值
我们可以把对象想象成散列表,无非就是一组名值对,其中值可以是数据或者函数

属性类型

数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。这个属性一旦定义为不可配置,就不能变回可配置了
[[Enumerable]]:表示能否通过for-in循环返回属性
[[Writeable]]:表示能否修改属性的值
[[Value]]:包含这个属性的数据值,读取数据值得时候,从这个位置读,写入属性值的时候,把新值保存在这个位置,这个特性默认值为undefined
对于直接在对象上定义的属性,前面三个特性的值都被默认设置为true,而[[Value]]被设置为指定的值】例如:

var person = {
	name : 'Myname'
}
//这里创建了一个名为name的属性,为他指定值为'Myname',那么[[Value]]特性将被设置为'name',而对这个值得任何修改都将反映在这个位置

如果要修改属性默认特性,就要使用Object.defineProperty()方法,这个方法接收三个参数:属性所在的对象,属性的名字和一个描述符对象,其中描述符对象必须是特姓名

Object.defineProperty(person,'name',{
	writable : false,
	value : 'mymymy'
});
//设置之后person对象的name属性就无法被修改了,变为只读

在调用Object.defineProperty()方法创建一个新的属性时,如果不指定,那么默认属性特性值都为false,但如果只是调用此方法修改已定义的属性的特性,则没有这个限制

访问器属性

访问器属性不包含数据值;他们包含一对儿geeterseeter函数,在读取访问器属性时,会调用geeter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用seeter函数并传入新值,这个函数负责决定如何处理数据
访问器属性有4个特性:
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,
或者能否把属性修改为数据属性,默认值为true
[[Enumerable]]:表示能否通过for-in循环返回属性,默认值为true
[[Get]]:在读取属性时调用的函数,默认为underfined
[[Set]]:在写入属性时调用的函数,默认为underfined
访问器属性不能直接定义,也要使用Object.defineProperty()

var book = {
 	_year : 2019,   //下划线是一种常用的记号   表示只能够通过对象方法访问属性
    edition : 1
};
Object.defineProperty(book,'year',{
	get : function (){
		return this._year;
	},
	set : function (newValue){
		if(newValue >2019){
			this._year = newValue;
			this.edition += newValue - 2019;
		}
	}
});
book.year = 2020;
console.log(book.edition)   //输出2

这个访问器属性year包含一个getter和一个setter函数,getter函数返回year的值,setter函数通过判断设置新的值
如果只指定getter意味着属性不能写,只指定setter的属性意味着不能读
可以定义多个属性

var book={}
Object.defineProperties(book,{
	_year:{
		writable:true,
		value:2019
	},
	edition : {
		writable:true,
		value:1
	},
	year:{
		get:function (){
			return this._year
		},
		set :function (newValue){
			if(newValue > 2019){
				this._year = newValue;
				this.edition += newValue - 2019;
			}
		}
	}
});

这里在book对象上定义了两个数据属性和一个访问器属性,记得这样创建数据属性的特性默认都为false

读取属性的特性

使用Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符
这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称,返回值是一个对象
比如上面定义多个属性的代码下面可以

//读数据属性
var read = Object.getOwnPropertyDsecriptor(book,'_year');
console.log(read.value);   //2019
console.log(read.configurable);  false
//读访问属性
var reading = Object.getOwnPropertyDsecriptor(book,'year');
console.log(reading.value);   //undefined
console.log(typeof reading.get)   //"function"

get 是一个指向getter函数的指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值