每个对象的属性有两种,每种属性有4中特征描述符

1.数据属性

1.1 [[configurable]]:表示不能通过delete删除属性,不能修改属性的特性,不能将数据属性改为访问器属性,默认值false

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });

        console.log(person.name); //pmx
        delete person.name;
        console.log(person.name); //pmx
</script>

打印出:

pmx

pmx

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            configurable:true
        });
</script>

报错:can not redefine property :name

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            enumerable:false
        });
 </script>

报错:can not redefine property :name

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            enumerable:true
        });

        for(var key in person){
            console.log(key+":"+person[key]);
        }
 </script>

打印出:name:pmx

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:false
        });
        for(var key in person){
            console.log(key+":"+person[key]);
        }
</script>

没有打印,但也没有报错

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            writable:false
        });
        person.name = "pan";
        console.log(person.name);
 </script>

打印出:pan

<script>
        var person = {
            name:"pmx"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            value:"panpan"
        });
        console.log(person.name);
 </script>

打印出:panpan

<script>
        var person = {
            name:"pan",
            city:"shanghai"
        }
        Object.defineProperty(person,"name",{
            configurable:true
        });
        Object.defineProperty(person,"name",{
            get:function(){
                return this.city;
            }
        });
        console.log(person.name);
</script>

打印出:shanghai

<script>
        var person = {
            name:"pan",
            city:"shanghai"
        }
        Object.defineProperty(person,"name",{
            configurable:false
        });
        Object.defineProperty(person,"name",{
            get:function(){
                return this.city;
            }
        });
        console.log(person.name);
</script>

报错:TypeError: Cannot redefine property: name

综上:

  a.configurable设置为false后,那么当前属性就是不可删除滴,delete无效果

  b.有两种方式创建对象。

    1.对象字面量法:var obj = {name:"pmx"};

    2.构造函数定义法:var obj = new Object();obj.name = "pmx";

    这两种方式创建的对象的属性的特征描述分别是:configurable:true,enumerable:true,writable:true,value:pmx

  c.configurable设置为false之后,不能再更改configurable和enumerable的值,但是对writable和value没有丝毫影响

  d.configurable设置为false之后,不能将数据属性更改为访问器属性

1.2 [[enumerable]]:表示能否通过for-in循环遍历对象属性,默认值false

<script>
        var person = {
            name:"pan",
            city:"shanghai"
        }
        Object.defineProperty(person,"name",{
            enumerable:false
        });

        for(var key in person){
            console.log(key+":"+person[key]);
        }
</script>

打印出:city=shanghai

没有name=pan

1.3 [[writable]]:表示能否修改属性的值,默认值false

<script>
        var person = {
            name:"pan"
        }
        Object.defineProperty(person,"name",{
            writable:false
        });
        person.name = 'pmx';
        console.log(person.name);
</script>

打印出:pan

1.4 [[value]]:包含这个属性的数据值,取数据时,从这里取,写数据时,将值写到这里,默认值undefined

<script>
        var person = {
            name:"pan"
        }
        Object.defineProperty(person,"name",{
            value:"pmx"
        });
        console.log(person.name);
 </script>

打印出:pmx

2.访问器属性

2.1 [[configurable]]:表示能否通过delete删除属性,更改属性的特性,将访问器属性更改为数据属性,默认值false

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            get:function(){
                return this._name;
            }
        });
        console.log(person.name);//pan
        delete person.name;
        console.log(person.name);//pan
</script>

打印出:

pmx

pmx

<script>
        var person = {
            _name:"pan"
        }
    //使用defineProperty创建的对象属性,默认的configurable:false,enmuerable:false,get:undefined,set:undefined
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:true,
            get:function(){
                return this._name;
            }
        });
       for(var i in person){
            console.log(i+":"+person[i]);
       }
    </script>

打印出:

_name:pan

name:pan

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:true,
            get:function(){
                return this._name;
            }
        });
        Object.defineProperty(person,"name",{
            enumerable:false
        });

       for(var i in person){
            console.log(i+":"+person[i]);
       }
</script>

报错:TypeError: Cannot redefine property: name

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:true,
            get:function(){
                return this._name;
            }
        });
        Object.defineProperty(person,"name",{
            set:function(value){
                this._name = value;
            }
        });

        person.name = "pmx";
       for(var i in person){
            console.log(i+":"+person[i]);
       }
</script>

报错:TypeError: Cannot redefine property: name

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:true,
            get:function(){
                return this._name;
            }
        });
        Object.defineProperty(person,"name",{
            get:function(){
                return "get";
            }
        });

        person.name = "pmx";
       for(var i in person){
            console.log(i+":"+person[i]);
       }
</script>

报错:TypeError: Cannot redefine property: name

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:false,
            enumerable:true,

        });
        Object.defineProperty(person,"name",{
            get:function(){
                return this._name;
            }
        });
</script>

报错:TypeError: Cannot redefine property: name

<script>
        var person = {
            _name:"pan"
        }
        Object.defineProperty(person,"name",{
            configurable:true,
            enumerable:true,
            get:function(){
                return this._name;
            }
        });
        Object.defineProperty(person,"name",{
            enumerable:true,
            writable:true,
            value:"pmx"
        });

       for(var i in person){
            console.log(i+":"+person[i]);
       }
</script>

打印出:

_name:pmx

name:pmx

综上:

  a.使用Object.defineProperty()创建的属性的默认特 性,configurable:false,enumerable:false,writable:false,value:undefined,get:undefined,set:undefined

  b.configurable:false时,不能更改enumerable,get,set;即使get,set为undefined,也不能重新定义get函数

  c.给访问器属性添加writable,value特性,就能将其转换为数据属性

2.2[[enumerable]]:表示能否通过for-in循环遍历对象属性,默认值false

2.3[[get]]:读取属性时调用的函数,默认值undefined

2.4[[set]]:写入属性时调用的函数,默认值undefined

3.为对象定义多个属性

Object.defineProperties()

<script>
        var person = {}
        Object.defineProperties(person,{
            name:{
                value:'pmx',
                writable:false,
                enumerable:true
            },
            city:{
                value:"shanghai",
                enumerable:false
            },
            _year:{
                value:2016,
                writable:false,
                enumerable:false
            },
            year:{
                enumerable:true,
                get:function(){
                    return this._year;
                }
            }
        });

        console.log(person.name); //pmx
        person.name = "pan";
        console.log(person.name); //pmx
        for(var key in person){
            console.log(key+":"+person[key]);  //name:pmx;year:2016
        }
</script>

4.读取属性的特性描述

Object.getOwnPropertyDescriptor()

<script>
        var person = {}
        person.name = "pmx";

        var des = Object.getOwnPropertyDescriptor(person,"name");
        for(var key in des){
            console.log(key+":"+des[key]);
        }
</script>

value:pmx
writable:true
enumerable:true
configurable:true

JS之对象的更多相关文章

  1. js定义对象的几种容易犯的错误

    //js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...

  2. 模仿console自写函数打印js的对象

    本以为写个递归函数就可以将js的对象打印出来. 当然第一个想到的估计是JSON.stringify() 这个函数.但这个函数打印到浏览器 显示效果不友好.最友好的显示肯定是 控制台打印咯. 结果尝试打 ...

  3. js自定义对象

    一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...

  4. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

    Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...

  5. js中对象使用

    简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一个含有两个属性的对象,x.y var o2={x:12,y:'12',name:'JS'}; ...

  6. JavaScript学习06 JS事件对象

    JavaScript学习06 JS事件对象 事件对象:当事件发生时,浏览器自动建立该对象,并包含该事件的类型.鼠标坐标等. 事件对象的属性:格式:event.属性. 一些说明: event代表事件的状 ...

  7. [转]JS中对象与字符串的互相转换

    原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...

  8. JS中对象与字符串的互相转换

    在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...

  9. JS面相对象

    一.理解对象: //第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = ; person.g ...

  10. 关于js一般对象与标配对象

    当一个js函数对象被创建时,Function 构造器产生的函数对象会运行类似这样的一些代码 this.prototype={constructor:this} 新函数被赋予了一个prototype属性 ...

随机推荐

  1. Tomcat在局域网中localhost可以访问,但是无法通过本地ip访问,127.0.0.1也无法访问问题的解决方法

    环境:Tomcat6,Windows Server2008 R2, Tomcat使用默认端口8080. 在BO服务器上使用Tomcat6作为WEB服务器,在服务器本地使用http://localhos ...

  2. jquery layer弹出层插件

    http://www.51xuediannao.com/js/jquery/jquery_layer/layer.html

  3. ACM:Pseudoforest-并查集-最大生成树-解题报

    Pseudoforest Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...

  4. Visiual Studio2012 CLR20r3问题

    看到有更新,习惯性的点了,升级到Visiual Studio Ultimate 2012 Update 1,并且按照提升重启了电脑.因为昨天太晚,也没验证.尽早打开VS,结果直接Crash.错误如下: ...

  5. eclipse安装color theme插件

    为Eclipse添加Color.Theme的插件 这样可以方便一键更换主题,再也不用一个一个设置BackgroundColor了,同时也方便回退到default默认主题配置. 方法一: 打开Eclip ...

  6. 蒟蒻修养之cf橙名计划2

    29 由于第一篇没写题意导致大部分神题题解已经完全不知道在说啥了...所以还是重开一篇保平安... [303A]题意:求三个长度为$n(n<=10^5)$的排列$a,b,c$使得$a_i+b_i ...

  7. thinkphp常用Config.php配置项

    <?php return array( //'配置项'=>'配置值' 'DB_HOST' => 'localhost', 'DB_USER' => 'root', 'DB_PW ...

  8. hadoop编程小技巧(5)---自定义输入文件格式类InputFormat

    Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...

  9. Linux多线程实例练习 - pthread_exit() 与 pthread_join()

    Linux多线程实例练习 - pthread_exit 与 pthread_join pthread_exit():终止当前线程 void pthread_exit(void* retval); pt ...

  10. 开源工作流引擎CCFlow 学习专区

    http://bbs.ccflow.org/index.aspx 官网:http://www.ccflow.org/