1.对象概念:对象是一组属性的无序集合。
2.对象属性的类型:
(1)数据属性:数据属性包含一个保存数据值的位置。值会从这个位置读取,也会写入到这个位置。数据属性有四个特性描述它们的行为。
[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。
[[Enumberable]]:表示属性是否可以通过for-in循环返回。
[[Writable]]:表示属性的值是否可以被修改
[[Value]]:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。
这四个属性的特征默认情况下都是true,要想修改属性的默认特性,就必须要使用Object.defineProperty()方法 ,这个方法接受三个参数:要给其添加属性的对象,属性的名称,和一个描述符的对象。最后一个参数,即描述符对象上包含:Configurable、Enumberable、Writable、Value,跟相关都得特性名称一一对应,根据要修改的特性可以设置其中一个或多个值。
let person = { name:'zs', age:21, sex:"man" } Object.defineProperty(person,'name',{ writable:false, enumerable:false }) person.name='lis' console.log(person.name)//zs for(i in person){ console.log(i,person[i]) }
在上面的例子中,定义了一个person对象,并且通过Object.defineProperty()方法对它的name属性进行了特性的修改,将Writable,Enumberable设为false结果就是不能修改name属性的值,并且for-in循环在无法返回name属性。
let person = { name:'zs', age:21, sex:"man" } 、 Object.defineProperty(person,'name',{ configurable:false }) Object.defineProperty(person,'name',{ configurable:true })//TypeError: Cannot redefine property: name
这个例子把configurable属性修改为false,意味着这个属性不能对对象上删除也不能重新设置他的特性。再次调用Object.defineProperty()方法修改任何非writable特性都会报错。
(2)访问器属性:访问器属性不包含不包含数据值。它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必须的。在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性时,还会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。访问器属性有4个特性描述它们的行为。
[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。
[[Enumerable]]:表示属性是否可以通for-in循环返回
[[get]]:获取函数,在读取属性时调用。默认值为undefined
[[set]]: 设置函数,在写入属性时调用。默认值是undefined
//定义一个对象,包含伪私有成员year_和公共成员edition let book={ year_:2022, edition:1 } Object.defineProperty(book,'year',{ get(){ return this.year_ }, set(newValue){ if(newValue > 2022){ this.year_ = newValue; this.edition = newValue - 2022 } } }) book.year = 2023 console.log(book)
在这个例子中对象book有两个默认属性year_和edition,year_中的下划线常用来表示该属性不希望在对象的外部方法被访问。另一个属性year被定义为访问器属性。其中获取函数简单的返回year_的
值,设置函数计算了editiion的数值。这是访问器属性的经典应用场景,即设置一个值会导致一些其他变化的发生。
获取函数和设置函数不一定要都定义。指定义获取函数意味着,属性是只读的尝试修改属性会被忽略,在严格模式下尝试写入值定义了获取函数的属性会抛出错误。类似的只有一个设置函数的属性是不能读取的,非严格模式下读取会返回undefined,严格模式下会报错。
标签:8.1,高程,name,函数,Object,JS,person,year,属性 From: https://www.cnblogs.com/SadicZhou/p/16969049.html