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

转载于:https://www.cnblogs.com/ghostwu/p/7395649.html

javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)相关推荐

  1. 深入 javascript 之 call函数 用法

    前言 js中有不少比较难以理解的概念,比如 js原型 和 继承 .我曾经很早的时候就看过js原型方面的知识,并在当时写了一篇 博客 作为记录,很显然当时的我只是死记硬背.最近我利用空闲的时间将一些相对 ...

  2. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  3. javaScript 中 call 函数的用法说明

    javaScript 中 call 函数的用法说明 javaScript 中的 call() 是一个奇妙的方法,但也是一个让人迷惑的方法,先看一下官方的解释: call 方法 请参阅 应用于:Func ...

  4. 详解 javascript中offsetleft属性的用法(转)

    详解 javascript中offsetleft属性的用法 转载  2015-11-11   投稿:mrr    我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...

  5. javascript面向对象编程实现[定义(静态)属性方法--继承]

    javascript面向对象编程实现:             1.类的声明:                 function test1(){                     this.p ...

  6. JavaScript面向对象和原型函数

    对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...

  7. javascript:window.scroll()函数behavior属性smooth属性值在iphone浏览器上不兼容

    javascript:window.scroll()函数behavior属性smooth属性值在iphone浏览器上不兼容 在制作静态页面的时候,使用window.scroll()来实现点击爬楼的事件 ...

  8. last modified php,lastModified属性_用法示例-javascript词典-js编程词典-php中文网

    last 英 [lɑ:st]   美 [læst] n.最后;末尾;上个;鞋楦(做鞋的模型) vt.经受住;到-之后;够用;足够维持(尤指某段时间) adj.最后的;最近的;最不可能的;惟一剩下的 v ...

  9. python isalpha函数用法_python中string模块各属性以及函数的用法

    任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求 ...

最新文章

  1. 若依框架使用数据权限
  2. 搭建linux下eclipse php完美搭建开发php,搭建linux上的Eclipse+PHP编程环境
  3. 40、Power Query-Text.Combine函数进阶
  4. Python函数中的变量作用域
  5. 【LeetCode笔记】88. 合并两个有序数组(Java、双指针)
  6. 如何将10元店,做到月2000万流水?
  7. Django uplodify 多文件同时上传
  8. ssh连接失败,排错经验
  9. k8s Service
  10. 西门子定时器有几种_【图】西门子step7功能块中定时器的类型与参数
  11. PulseAudio 模块化实现录音和放音
  12. 注塑工艺工程师视频教程 注塑机调机成型参数教程
  13. 仿牛客社区项目3.2——发布帖子(异步通信技术AJAX)
  14. Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices
  15. 给邮箱和手机号码打码
  16. 半小时学会LevelDB原理及应用
  17. 如何通过文献查找该文献的代码
  18. python开发工具-5个最好用的Python编程开发工具(IDE)分享
  19. chacha20加密c语言算法,Java 11的新加密算法ChaCha20-Poly1305
  20. 行转换html,块级、行内、行内元素相互转换

热门文章

  1. HTMLCSS课堂笔记
  2. Visual Source Safe(VSS)使用教程
  3. jvm 调优_Java架构—JVM调优
  4. 【php7扩展开发六】zval的操作
  5. 隐藏了十年的Sudo漏洞爆出:无需密码就能获取root权限
  6. 记一次对学校的渗透测试
  7. (二)k-means算法原理以及python实现
  8. errno的基本用法
  9. Scala入门到精通——第二十八节 Scala与JAVA互操作
  10. Spark学习笔记:数据读取和保存