javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)
defineProperty用于设置一个对象的属性值和描述符,描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]]
当一个属性的描述符设置了[[Writable]],是什么意思呢?
"use strict";
var person = {};
Object.defineProperty( person, "name", {
writable : false,
value : 'ghostwu'
} );
console.log( person.name ); //ghostwu
person.name = "this is ghostwu";
console.log( person.name );//ghostwu
defineProperty为person对象,添加一个name属性,两个属性描述符:
writeble属性: false:不可写 true: 可写
value属性: 'ghostwu'
也就是说,name这个属性的值为ghostwu, 但是不能修改这个值。writable为false的时候,
如果对这个属性name进行重新赋值(修改)在非严格模式下,赋值会被忽略,在严格模式下会报错. 当一个属性的描述符设置了[[Configurable]]?
// "use strict";
var person = {};
Object.defineProperty( person, "name", {
configurable : false,
value : 'ghostwu'
} );
console.log( person.name ); //ghostwu
delete person.name;
console.log( person.name );//ghostwu Object.defineProperty( person, "name", {
configurable : true, //报错
value : 'ghostwu'
} );
defineProperty为person对象,添加一个name属性,
- configurable属性: false:不可配置 true: 可配置
- value属性: 'ghostwu'
也就是说,name这个属性的值为ghostwu, 但是不能删除这个值,
configurable为false的时候,如果删除name属性,在非严格模式下,删除操作会被忽略,在严格模式下会报错
而且如果对一个设置了configurable为false的属性,想把它重新改为true,会报错, 如上例12行
当一个属性的描述符设置了[[Enumerable]]?
// "use strict";
var person = {};
Object.defineProperty(person, "name", {
enumerable: true,
value: 'ghostwu'
});
Object.defineProperty(person, "sex", {
enumerable: false,
value: 'man'
});
Object.defineProperty(person, "age", {
enumerable: true,
value: 22
}); /*
name--->ghostwu
age--->22
*/
for( var i in person ){
console.log( i + '--->' + person[i] );
}
defineProperty为person对象,添加3个属性,name,age,sex. enumerable属性: false:不可枚举 true: 可枚举
也就是说一个属性,如果他的enumerable的值为false,那么这个属性是不能被for...in遍历(循环/枚举)
如上例, sex设置为不可枚举, 所以for..in不会把他枚举出来
Object.getOwnPropertyDescriptor()方法:可以取得给定属性的描述符, 这个方法支持2个参数, 参数1:属性所在的对象. 参数2 : 属性名称。返回值为一个对象
var person = {
name : 'ghostwu',
age : 22,
};
var descriptor = Object.getOwnPropertyDescriptor( person, "name" );
console.log( descriptor.configurable ); //true
console.log( descriptor.enumerable ); //true
console.log( descriptor.writable ); //true
console.log( descriptor.value ); //ghostwu
对于没有使用Object.defineProperty定义的对象. 他们的描述符: configurable,enumerable,writable默认值都为true.
var person2 = {
}
Object.defineProperty( person2, "name", {
value : 'ghostwu'
});
var descriptor2 = Object.getOwnPropertyDescriptor( person2, "name" );
console.log( descriptor2.configurable ); //false
console.log( descriptor2.enumerable ); //false
console.log( descriptor2.writable ); //false
console.log( descriptor2.value ); //ghostwu
对于使用Object.defineProperty定义的对象,如果没有配置描述符的值,那么configurable,enumerable,writable默认值为false
javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)的更多相关文章
- JavaScript 全局属性/函数
JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...
- JavaScript面向对象(01)--函数
在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下: 1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内 ...
- JavaScript全局属性/函数
JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...
- javaScript中with函数用法实例分析
javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...
- JavaScript面向对象之函数构造器的理解
1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...
- JavaScript面向对象+Array的用法及字符串组合+动态建立锚点
脚本部分: function school(sName,sDddress,sPhone,sMail) { this.SName = sName; this.SAddress = sDddress; t ...
- JavaScript replace 回调函数用法
params.query = params.query.replace(/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:\\]/g,function(a){ ...
- JavaScript面向对象轻松入门之综合
javascrpit面向对象之综合 这一章是对前几章的一个总结,通过一个案例来综合认识javascript面向对象的基本用法 需求: 几乎所有的web应用都需要保存数据一些到本地,那么我们就来 ...
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
随机推荐
- Linux10分钟入门
最近打算考红帽认证,将自己学习到的和工作中常用的一些命令进行总结,供初学者和一定基础的参考. 想系统性学习的话,还是建议看书(鸟哥的Linux私房菜)和看视频(基础版,推荐马哥和老男孩,不推荐**** ...
- Tomcat学习笔记(一)一个简单的Web服务器
内容为<深入剖析Tomcat>第一章重点,以及自己的总结,如有描述不清的,可查看原书. 一.HTTP协议: 1.定义:用于服务器与客户端的通讯的协议,允许web服务器和浏览器通过互联网进行 ...
- 软考 程序员 下午考题 c语言 笔记
1. 数组名 是表示数组空间首地址的指针常量,程序中不允许对常量赋值. 如 int a[]; a就是数组名,表示数组控件首地址的指针常量 a = 0;是错误的,不允许对指针常量赋值 &a ...
- Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解
这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...
- POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat 二分)
POJ 2296 Map Labeler / ZOJ 2493 Map Labeler / HIT 2369 Map Labeler / UVAlive 2973 Map Labeler(2-sat ...
- 增强for循环赋值
增强for循环赋值 代码如下: double[] testList01 = new double[5]; java.util.Scanner sc = new java.util.Scanner(Sy ...
- Ubuntu14.04安装有道词典
Ubuntu14.04安装有道词典之前要更新系统: sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade 在有道官网下载 ...
- webgl开发第一道坎——矩阵与坐标变换
一.齐次坐标 在3D世界中表示一个点的方式是:(x, y, z);然而在3D世界中表示一个向量的方式也是:(x, y, z);如果我们只给一个三元组(x, y, z)鬼知道这是向量还是点,毕竟点与向量 ...
- Struts2入门项目开发小步骤
Step1: Struts2的获取和添加到项目中: 在官方网站:http://struts.apache.org 获取Struts的其中一个版本. 在开发项目之前,需要添加struts2的类库支持,也 ...
- 让 Python 带你进入开源的世界——Git 从入门到与他人协作开发
让 Python 带你进入开源的世界--Git 从入门到与他人协作开发 我认为开源社区中有很多优秀的资源,并且可以帮助进阶中的程序员提高编程能力和水平.所以,我发起了<HelloGitHub&g ...