每个对象的属性有两种,每种属性有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之对象的更多相关文章
-
js定义对象的几种容易犯的错误
//js定义对象的几种容易犯的错误function Person() { getName = function (){ console.info(1); }; return this;}//Perso ...
-
模仿console自写函数打印js的对象
本以为写个递归函数就可以将js的对象打印出来. 当然第一个想到的估计是JSON.stringify() 这个函数.但这个函数打印到浏览器 显示效果不友好.最友好的显示肯定是 控制台打印咯. 结果尝试打 ...
-
js自定义对象
一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在Javascrip ...
-
Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...
-
js中对象使用
简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一个含有两个属性的对象,x.y var o2={x:12,y:'12',name:'JS'}; ...
-
JavaScript学习06 JS事件对象
JavaScript学习06 JS事件对象 事件对象:当事件发生时,浏览器自动建立该对象,并包含该事件的类型.鼠标坐标等. 事件对象的属性:格式:event.属性. 一些说明: event代表事件的状 ...
-
[转]JS中对象与字符串的互相转换
原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...
-
JS中对象与字符串的互相转换
在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...
-
JS面相对象
一.理解对象: //第一种:基于Object对象 var person = new Object(); person.name = 'My Name'; person.age = ; person.g ...
-
关于js一般对象与标配对象
当一个js函数对象被创建时,Function 构造器产生的函数对象会运行类似这样的一些代码 this.prototype={constructor:this} 新函数被赋予了一个prototype属性 ...
随机推荐
-
css3选择器(上)
1.给导航加分割线,左右 .nav li::before,.nav li::after{ content:""; position:absolute; top:14px; heig ...
-
[翻译] java NIO Channel
原文地址:http://tutorials.jenkov.com/java-nio/channels.html JAVA NIO channels和流的概念很像,下面是他们的一些区别: 你可以对cha ...
-
POJ 2100
Graveyard Design Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 4443 Accepted: 946 ...
-
真机无法接收到android.provider.Telephony.SMS_RECEIVED的问题
小米2S有一个设定会导致,App无法接收到android.provider.Telephony.SMS_RECEIVED广播. 解决方案 关闭系统短信优先设置 短信-设置-高级设置-系统短信优先 ...
-
android strings.xml转义字符, 注意细节解决(转)
XML转义字符 以下为XML标志符的数字和字符串转义符 " (" 或 ") ' (' 或 ') & (& 或 & ...
-
Web定时执行某个方法-网页获取
实现该功能用到的是System.Timers.Timer 将定时的方法添加到Global.ascx.cs中 public class Global : System.Web.HttpApplicati ...
-
谈谈Ext JS的组件——布局的用法续二
绝对布局(Ext.layout.container.Absolute) 绝对布局让我回忆到了使用Foxpro开发的时候,哪时候的界面布局就是这样.通过设置控件的左上角坐标(x.y)和宽度来进行的,由于 ...
-
centos 6.5静态网址简单配置
详细配置参数参考如下: DEVICE=eth0HWADDR=08:00:27:F1:72:C9TYPE=EthernetUUID=dab98425-fa46-4a5b-8f47-cf846d4acb3 ...
-
JVM常见问题 一(转载)
1. 内存模型以及分区 JVM内存模型如下图所示: 此处我们集中注意中间绿色的部分,该部分为JVM的运行时内存,该部分包含了: 线程私有的(灰色): 程序计数器:记录执行到第几条指令 虚拟机方法栈:执 ...
-
django----Form提交按钮
form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响 <button class="login" ty ...