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
转载于:https://www.cnblogs.com/ghostwu/p/7395649.html
javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)相关推荐
- 深入 javascript 之 call函数 用法
前言 js中有不少比较难以理解的概念,比如 js原型 和 继承 .我曾经很早的时候就看过js原型方面的知识,并在当时写了一篇 博客 作为记录,很显然当时的我只是死记硬背.最近我利用空闲的时间将一些相对 ...
- JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝
本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...
- javaScript 中 call 函数的用法说明
javaScript 中 call 函数的用法说明 javaScript 中的 call() 是一个奇妙的方法,但也是一个让人迷惑的方法,先看一下官方的解释: call 方法 请参阅 应用于:Func ...
- 详解 javascript中offsetleft属性的用法(转)
详解 javascript中offsetleft属性的用法 转载 2015-11-11 投稿:mrr 我要评论 本章节通过代码实例介绍一下offsetleft属性的用法,需要的朋友可以做一 ...
- javascript面向对象编程实现[定义(静态)属性方法--继承]
javascript面向对象编程实现: 1.类的声明: function test1(){ this.p ...
- JavaScript面向对象和原型函数
对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...
- javascript:window.scroll()函数behavior属性smooth属性值在iphone浏览器上不兼容
javascript:window.scroll()函数behavior属性smooth属性值在iphone浏览器上不兼容 在制作静态页面的时候,使用window.scroll()来实现点击爬楼的事件 ...
- last modified php,lastModified属性_用法示例-javascript词典-js编程词典-php中文网
last 英 [lɑ:st] 美 [læst] n.最后;末尾;上个;鞋楦(做鞋的模型) vt.经受住;到-之后;够用;足够维持(尤指某段时间) adj.最后的;最近的;最不可能的;惟一剩下的 v ...
- python isalpha函数用法_python中string模块各属性以及函数的用法
任何语言都离不开字符,那就会涉及对字符的操作,尤其是脚本语言更是频繁,不管是生产环境还是面试考验都要面对字符串的操作. python的字符串操作通过2部分的方法函数基本上就可以解决所有的字符串操作需求 ...
最新文章
- 若依框架使用数据权限
- 搭建linux下eclipse php完美搭建开发php,搭建linux上的Eclipse+PHP编程环境
- 40、Power Query-Text.Combine函数进阶
- Python函数中的变量作用域
- 【LeetCode笔记】88. 合并两个有序数组(Java、双指针)
- 如何将10元店,做到月2000万流水?
- Django uplodify 多文件同时上传
- ssh连接失败,排错经验
- k8s Service
- 西门子定时器有几种_【图】西门子step7功能块中定时器的类型与参数
- PulseAudio 模块化实现录音和放音
- 注塑工艺工程师视频教程 注塑机调机成型参数教程
- 仿牛客社区项目3.2——发布帖子(异步通信技术AJAX)
- Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices
- 给邮箱和手机号码打码
- 半小时学会LevelDB原理及应用
- 如何通过文献查找该文献的代码
- python开发工具-5个最好用的Python编程开发工具(IDE)分享
- chacha20加密c语言算法,Java 11的新加密算法ChaCha20-Poly1305
- 行转换html,块级、行内、行内元素相互转换