• javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)


    defineProperty用于设置一个对象的属性值和描述符,描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]]

    当一个属性的描述符设置了[[Writable]],是什么意思呢?

    1         "use strict";
    2         var person = {};
    3         Object.defineProperty( person, "name", {
    4             writable : false,
    5             value : 'ghostwu'
    6         } );
    7         console.log( person.name ); //ghostwu
    8         person.name = "this is ghostwu";
    9         console.log( person.name );//ghostwu
    defineProperty为person对象,添加一个name属性,两个属性描述符:
    • writeble属性: false:不可写 true: 可写

    • value属性: 'ghostwu'

    也就是说,name这个属性的值为ghostwu, 但是不能修改这个值。writable为false的时候,
    如果对这个属性name进行重新赋值(修改)在非严格模式下,赋值会被忽略,在严格模式下会报错.

    当一个属性的描述符设置了[[Configurable]]?
     1 //        "use strict";
     2         var person = {};
     3         Object.defineProperty( person, "name", {
     4             configurable : false,
     5             value : 'ghostwu'
     6         } );
     7         console.log( person.name ); //ghostwu
     8         delete person.name;
     9         console.log( person.name );//ghostwu
    10 
    11         Object.defineProperty( person, "name", {
    12             configurable : true,  //报错
    13             value : 'ghostwu'
    14         } );

    defineProperty为person对象,添加一个name属性,

    • configurable属性: false:不可配置 true: 可配置
    • value属性: 'ghostwu'

    也就是说,name这个属性的值为ghostwu, 但是不能删除这个值,
    configurable为false的时候,如果删除name属性,在非严格模式下,删除操作会被忽略,在严格模式下会报错

    而且如果对一个设置了configurable为false的属性,想把它重新改为true,会报错, 如上例12行

    当一个属性的描述符设置了[[Enumerable]]?

     1 //        "use strict";
     2         var person = {};
     3         Object.defineProperty(person, "name", {
     4             enumerable: true,
     5             value: 'ghostwu'
     6         });
     7         Object.defineProperty(person, "sex", {
     8             enumerable: false,
     9             value: 'man'
    10         });
    11         Object.defineProperty(person, "age", {
    12             enumerable: true,
    13             value: 22
    14         });
    15 
    16         /*
    17             name--->ghostwu
    18             age--->22
    19         */
    20         for( var i in person ){
    21             console.log( i + '--->' + person[i] );
    22         }

    defineProperty为person对象,添加3个属性,name,age,sex.  enumerable属性: false:不可枚举 true: 可枚举
    也就是说一个属性,如果他的enumerable的值为false,那么这个属性是不能被for...in遍历(循环/枚举)
    如上例, sex设置为不可枚举, 所以for..in不会把他枚举出来

    Object.getOwnPropertyDescriptor()方法:可以取得给定属性的描述符, 这个方法支持2个参数, 参数1:属性所在的对象. 参数2 : 属性名称。返回值为一个对象

    1         var person = {
    2             name : 'ghostwu',
    3             age : 22,
    4         };
    5         var descriptor = Object.getOwnPropertyDescriptor( person, "name" );
    6         console.log( descriptor.configurable ); //true
    7         console.log( descriptor.enumerable ); //true
    8         console.log( descriptor.writable ); //true
    9         console.log( descriptor.value ); //ghostwu

    对于没有使用Object.defineProperty定义的对象. 他们的描述符: configurable,enumerable,writable默认值都为true.

     1         var person2 = {
     2         }
     3         Object.defineProperty( person2, "name", {
     4             value : 'ghostwu'
     5         });
     6 
     7         var descriptor2 = Object.getOwnPropertyDescriptor( person2, "name" );
     8         console.log( descriptor2.configurable ); //false
     9         console.log( descriptor2.enumerable ); //false
    10         console.log( descriptor2.writable ); //false
    11         console.log( descriptor2.value ); //ghostwu
    对于使用Object.defineProperty定义的对象,如果没有配置描述符的值,那么configurable,enumerable,writable默认值为false

  • 相关阅读:
    写给大数据开发初学者的话 | 附教程
    Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你
    如何学习大数据?阿里大数据开发师分享学习知识
    最简大数据Spark2.1.0
    从技术 Leader 的招聘需求看,如何转岗为当前紧缺的大数据相关人才?
    Redis内核原理及读写一致企业级架构深入剖析1综合组件环境实战
    为什么85%的大数据项目总是失败?
    js中的this关键字
    php百度api调用简单实例
    nginx常用命令
  • 原文地址:https://www.cnblogs.com/ghostwu/p/7395649.html
Copyright © 2020-2023  润新知