zoukankan      html  css  js  c++  java
  • Object.defineProperty()属性设置介绍

    注释:

    本文宅自https://segmentfault.com/a/1190000007434923,仅学习方便,没有任何商业用途

    对象是由多个名/值对组成的无序的集合。对象中每个属性对应任意类型的值。
    定义对象可以使用构造函数或字面量的形式:

    1 var obj = new Object;  //obj = {}
    2 obj.name = "张三";  //添加描述
    3 obj.say = function(){};  //添加行为

    除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或修改原有的属性

    Object.defineProperty()

    语法:

    1 Object.defineProperty(obj, prop, descriptor)

    参数说明:

    1 obj:必需。目标对象
    2 prop:必需。需定义或修改的属性的名字
    3 descriptor:必需。目标属性所拥有的特性

    返回值:

    传入函数的对象。即第一个参数obj;

    针对属性,我们可以给这个属性设置一些特性,比如是否只读不可以写;是否可以被for..inObject.keys()遍历。

    给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述。

    数据描述

    当修改或定义对象的某个属性的时候,给这个属性添加一些特性:

     1 var obj = {
     2     test:"hello"
     3 }
     4 //对象已有的属性添加特性描述
     5 Object.defineProperty(obj,"test",{
     6     configurable:true | false,
     7     enumerable:true | false,
     8     value:任意类型的值,
     9     writable:true | false
    10 });
    11 //对象新添加的属性的特性描述
    12 Object.defineProperty(obj,"newKey",{
    13     configurable:true | false,
    14     enumerable:true | false,
    15     value:任意类型的值,
    16     writable:true | false
    17 });

    数据描述中的属性都是可选的,来看一下设置每一个属性的作用。

    value

    属性对应的值,可以使任意类型的值,默认为undefined

     1 var obj = {}
     2 //第一种情况:不设置value属性
     3 Object.defineProperty(obj,"newKey",{
     4 
     5 });
     6 console.log( obj.newKey );  //undefined
     7 ------------------------------
     8 //第二种情况:设置value属性
     9 Object.defineProperty(obj,"newKey",{
    10     value:"hello"
    11 });
    12 console.log( obj.newKey );  //hello

    writable

    属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。

     1 var obj = {}
     2 //第一种情况:writable设置为false,不能重写。
     3 Object.defineProperty(obj,"newKey",{
     4     value:"hello",
     5     writable:false
     6 });
     7 //更改newKey的值
     8 obj.newKey = "change value";
     9 console.log( obj.newKey );  //hello
    10 
    11 //第二种情况:writable设置为true,可以重写
    12 Object.defineProperty(obj,"newKey",{
    13     value:"hello",
    14     writable:true
    15 });
    16 //更改newKey的值
    17 obj.newKey = "change value";
    18 console.log( obj.newKey );  //ch

    enumerable

    此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。

     1 var obj = {}
     2 //第一种情况:enumerable设置为false,不能被枚举。
     3 Object.defineProperty(obj,"newKey",{
     4     value:"hello",
     5     writable:false,
     6     enumerable:false
     7 });
     8 
     9 //枚举对象的属性
    10 for( var attr in obj ){
    11     console.log( attr );  //console不出来
    12 }
    13 //第二种情况:enumerable设置为true,可以被枚举。
    14 Object.defineProperty(obj,"newKey",{
    15     value:"hello",
    16     writable:false,
    17     enumerable:true
    18 });
    19 
    20 //枚举对象的属性
    21 for( var attr in obj ){
    22     console.log( attr );  //newKey
    23 }

    configurable

    是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。

    这个属性起到两个作用:

    目标属性是否可以使用delete删除

    目标属性是否可以再次设置特性

     1 //-----------------测试目标属性是否能被删除------------------------
     2 var obj = {}
     3 //第一种情况:configurable设置为false,不能被删除。
     4 Object.defineProperty(obj,"newKey",{
     5     value:"hello",
     6     writable:false,
     7     enumerable:false,
     8     configurable:false
     9 });
    10 //删除属性
    11 delete obj.newKey;
    12 console.log( obj.newKey ); //hello
    13 
    14 //第二种情况:configurable设置为true,可以被删除。
    15 Object.defineProperty(obj,"newKey",{
    16     value:"hello",
    17  

    除了可以给新定义的属性设置特性,也可以给已有的属性设置特性

     1 //定义对象的时候添加的属性,是可删除、可重写、可枚举的。
     2 var obj = {
     3     test:"hello"
     4 }
     5 
     6 //改写值
     7 obj.test = 'change value';
     8 
     9 console.log( obj.test ); //'change value'
    10 
    11 Object.defineProperty(obj,"test",{
    12     writable:false
    13 })
    14 
    15 
    16 //再次改写值
    17 obj.test = 'change value again';
    18 
    19 console.log( obj.test ); //依然是:'change value'

    提示:一旦使用Object.defineProperty给对象添加属性,那么如果不设置属性的特性,那么configurable、enumerable、writable这些值都为默认的false

     1 var obj = {};
     2 //定义的新属性后,这个属性的特性中configurable,enumerable,writable都为默认的值false
     3 //这就导致了neykey这个是不能重写、不能枚举、不能再次设置特性
     4 //
     5 Object.defineProperty(obj,'newKey',{
     6 
     7 });
     8 
     9 //设置值
    10 obj.newKey = 'hello';
    11 console.log(obj.newKey);  //undefined
    12 
    13 //枚举
    14 for( var attr in obj ){
    15     console.log(attr);
    16 }
  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/yangguoe/p/8055888.html
Copyright © 2011-2022 走看看