Object.defineProperty() 吴小明

摘要:
定义:Object.defineProperty(object,propName,descriptor)为对象定义新的属性,或者对某个属性进行修改,并将这个对象返回出来object:对象  给谁加propName:属性名  要添加的属性的名字,是一个字符串descriptor:属性描述  要加的这个属性有什么特点属性描述对象的6个属性:value      属性的值writable     属性值

定义:Object.defineProperty(object, propName, descriptor)为对象定义新的属性,或者对某个属性进行修改,并将这个对象返回出来

object:对象  给谁加

propName:属性名  要添加的属性的名字,是一个字符串

descriptor:属性描述  要加的这个属性有什么特点

属性描述对象的6个属性:

value      属性的值

writable     属性值是否可以重写,默认为false

enumerable    属性值是否可枚举,默认为false

configurable   属性值是否可删除/是否可以再次修改特性,默认为false

set       目标属性设置值的方法

get       目标属性获取值的方法

1、descriptor的第一个属性:value  要加的属性值是什么,默认值:undefined

      Object.defineProperty(user, 'name', {
        value: '小明'})
      Object.defineProperty(user, 'isShow', {
        value: true})
      Object.defineProperty(user, 'age', {
        value: 18})
      Object.defineProperty(user, 'sayHi', {
        value: function() {
          console.log('hi')
        }
      })
      Object.defineProperty(user, 'hobby', {
        value: { a: '篮球', b: '足球'}
      })
      console.log(user) //{name: '小明', isShow: true, age: 18, hobby: { a: '篮球', b: '足球' }, sayHi: ƒ}

2、descriptor的第二个属性:writable  属性是否可以被重新赋值,默认值:false

      const user ={}
      Object.defineProperty(user, 'name', {
        value: '小明'})
      user.name = '小小明' //此时无法改变name的值
      console.log(user) //{name: '小明'}
      const user ={}
      Object.defineProperty(user, 'name', {
        value: '小明',
        writable: true //默认值为false,当设置为true时可以重新赋值name
})
      user.name = '小小明'console.log(user) //{name: '小小明'}

3、descriptor的第三个属性:enumerable  是否可以被枚举,默认值:false

      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男',
        enumerable: true})
      Object.defineProperty(user, 'score', {
        value: 100,
        enumerable: false //此时该属性不可以被遍历
})
      const keys =Object.keys(user)
      console.log(keys) //['name', 'age', 'gender']

要注意,不可枚举属性可以通过对象.获取,但是它是不可以被遍历的,并不是说不能通过对象去获取这个值了

      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男'})
      const keys =Object.keys(user)
      console.log(keys) //['name', 'age']
      for (let item inuser) {
        console.log(item) //name age
}
      console.log(user) //{name: '小明', age: 18, gender: '男'}

4、descriptor的第四个属性:configurable  是否可以被删除,是否可以在第一次定义后再重新定义,默认值:false

      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男'
})
      delete user.gender //删除无效console.log(user) //{name: '小明', age: 18, gender: '男'}
      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男'
})
      user.gender = '女' //重新定义无效console.log(user) //{name: '小明', age: 18, gender: '男'}
      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男'
})
      //使用Object.defineProperty()重新定义gender会报错
      Object.defineProperty(user, 'gender', {
        value: '女'})console.log(user) //Uncaught TypeError: Cannot redefine property: gender

Object.defineProperty() 吴小明第1张

      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男',
        configurable: true})
      delete user.gender //删除有效
      console.log(user) //{name: '小明', age: 18}
      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男',
        configurable: true})
      //可以通过Object.defineProperty()重新定义gender
      Object.defineProperty(user, 'gender', {
        value: '女'})
      console.log(user) //{name: '小明', age: 18, gender: '女'}

重新定义gender之后,configurable的值不设置为false即认为是继承了第一次设置的true,此时可以删除gender;一旦重新定义gender后设置了configurable为false,即不可以再进行设置,也不可以再删除

      const user ={
        name: '小明',
        age: 18}
      Object.defineProperty(user, 'gender', {
        value: '男',
        configurable: true})
      //可以通过Object.defineProperty()重新定义gender
      Object.defineProperty(user, 'gender', {
        value: '女',
        //configurable: false // 写了这句则不可以删除,否则值默认为第一次定义时的true
})
      delete user.gender //若第二次定义gender时明确声明了configurable: false,此时不可以删除;若没有定义则认为继承了第一次定义时的true,此时可以删除
      console.log(user) //{name: '小明', age: 18}

5、descriptor的第五个属性:存取器(set、get)

      const user ={
        name: '小明'}
      let count = 12const obj = Object.defineProperty(user, 'age', {
        get: function() {
          returncount
        },
        set: function(val) {
          count =val
        }
      })
      console.log(user.age) //12
      user.age = 18console.log(user.age) //18

注意:

①set和get可以一起写,也可以写一个

②写了set或get后,不能设置value和writable属性了,否则会报错

免责声明:文章转载自《Object.defineProperty() 吴小明》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用SpringBoot Admin监控SpringCloud微服务引入AOP 报错 error at ::0 formal unbound in pointcut下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#窗体如何通过keybd_event()函数模拟键盘按键(组合键)产生事件

如何模拟键盘按键触发产生的事件,比如模拟按下Alt + F4 关闭当前程序,Ctrl+Shift 切换输入法等 可以通过win32api 键盘事件 keybd_event() 来实现 1、定义键盘按键对应得键码 #region bVk参数 常量定义 public const byte vbKeyLButton = 0x1;...

linux环境下 C++性能测试工具 gprof + kprof + gprof2dot

1.gprof 很有名了,google下很多教程 g++ -pg -g  -o test test.cc ./test   //会生成gmon.out gprof ./test > prof.log 看一下对于我前面提到的huffman编码压缩+解码解压缩全部过程的一个程序 对于生成的prof.log ,wow, 很有用处的但是看起来有点累,不是吗:)...

老vue项目webpack3升级到webpack5全过程记录(一)

背景 19年新建的vue项目,使用的是webpack3,随着项目的积累,组件的增多导致本地构建,线上打包等操作速度极慢,非常影响开发效率和部署效率,基于此问题,本次对webpack及相关插件进行了优化和升级。本博文分为2篇,第 1 篇 会直接附上可运行的代码(去除了一些业务代码配置),直接粘贴复制即可使用(注意是基于vue2.0项目原配置基础上的修改哦,在...

OpenGL ES着色器语言----------------储存修饰符

一、存储修饰符 本地变量只能使用存储修饰符const。 函数参数只能用const。函数返回值类型和结构体字段不要使用const。 从一个运行时着色器到下一个运行时着色器之间进行数据类型通信是不存在的。这阻止了同一个着色器在多个顶点和片元之间同时执行。 没有存储修饰符或仅仅使用const修饰符的全局变量,可能在main()执行前进行初始化。Uniforms...

C#程序员开发WinForm必须知道的 Window 消息大全(转)

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键都会使Windows发送一个消息给应用程序。 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做TMsg,它在Windows...

C++篇实现MD5算法

1、头文件 #ifndef MD5_H  #define MD5_H  #include <string>  #include <fstream>  /* Type define */  typedef unsigned char byte;  typedef unsigned int uint32;  using std::st...