JS高程8.1.1属性的类型笔记

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,严格模式下会报错。

 

posted @ 2022-12-09 16:38  SadicZhou  阅读(23)  评论(0编辑  收藏  举报