js 中对象属性特性的描述
来源:互联网 发布:淘宝油烟净化器 编辑:程序博客网 时间:2024/04/30 15:50
如何自定义属性的特性?
用对象.属性的特性和自定义的属性的特性有什么区别?
它的四大特性 writable enumerable configable 有什么区别?
先预习一个用对象.属性定义 ,属性的四大特性是以什么方式呈现的。
这时个属性的三大特性默认值都为true。
代码演示:
1 <script> 2 //用对象.属性定义的属性,它的三大特性都为true 3 function Foo(){} 4 Foo.prototype.age = 22 5 var obj = new Foo() 6 obj.name = "ziksang" 7 obj.addr = "上海" 8 obj.telephone = 15921848427 9 console.log(obj.name)//=>ziksang10 obj.name = "博客园" //修改了name属性的值11 console.log(obj.name) //=>博客园 因为此时定义的方式 writable为true,所以可以修改name的属性值12 for( var p in obj){ //因为此时定义的方式,enumerable为true, 此时也是可以枚举的,13 console.log(p) //用for in枚举可以把对象原型上的属性也枚举出来,因为原型上的属性也是用此定义属性,所以他的enumerable也为true14 }15 console.log(Object.keys(obj)) //用Object.keys(obj)方式枚举只能枚举对象自有的属性16 delete obj.addr //删除对象上addr属性17 console.log(obj.addr) //=>undefined 因为用此定义时他的configurable为true,所以是可以删除对象的18 Foo.prototype.age = 33 //对于三大特性,我对原型上的属性只做了一个修改的特性,因为原型上定义的方式如果也是对象.属性定义的话,跟对象属性的三大特性一样,在此就不一一举例了19 console.log(Foo.prototype.age) //=>3320 </script>
如何用Object.defineProperty自定义属性的特性
语法 :
Object.defineProperyty(obj,prop,descriptor)
obj: 需要定义的对象
prop:需要定义 或修改的属性名
descriptor:属性定义或修改的属性描述
该方法允许精确添加或修改对象的属性,正常属性添加通过赋值来创建并显示在属性枚举中(for in 循环或Object.keys()方法),这种 方式添加的属性值可能被改变,也可能会被删除。该方法允许改变这些额外细节默认设置。
configureable:当且仅当这个属性描述符值为true时,该属性可能会改变,也可能会被从相应的对象删除。默认为false.
enumerable:true当且仅当该属性出现在相应的对象枚举属性中。默认为false.
value:与属性有关的值。可以是任何有效的javascript值。默认为undefined.
writable:true当且仅当可能用赋值运算符改变与属性相关的值。默认为false.
第一种方式,当不设定三大属性时?
代码演示如下:
1 <script> 2 //如果用自定义Object.defineProperty方式来自定义属性的话,没有设置三大属性为true时,默认为false,看看在默认情况下会如何 3 function Foo(){} 4 Foo.prototype.age = 22 5 var obj = new Foo() 6 obj.name = "ziksang" 7 Object.defineProperty(obj,"telephone",{ 8 value:15921848427 //这个语句的意思就是在obj对象上创建了一个telephone属性,设定它的值为15921848427,对它的三大属性没有任何设置,此时三大属性为默认false 9 })10 console.log(obj.telephone) //因为上面自定义时赋值为15921848427,所以获取值为159....11 obj.telephone = 110 //此处我修改其属性值12 console.log(obj.telephone) //结果输出结果还是159....因为writable是默认值false,所以是不可修改的13 for(var p in obj){ //此处输出结果为 name,age 因为用for in枚举的是对象自身属性和原型上的属性,为什么没有telephone呢?因为此时obj对象上属性的特性enumerable也是默认false14 console.log(p)15 }16 console.log(Object.keys(obj)) //此处输出结果为name,因为用object.keys枚举的是对象自身的属性17 delete obj.telephone; //删除telephone属性18 console.log(obj.telephone) //因为自定义的属性特性默认值为false 所以是不可以删除的19 20 21 //对象上的原型也可以用此方法定义属性22 Object.defineProperty(Foo.prototype,"addr",{23 value:"上海" //对象原型上自定义一个属性addr 三大特性都为默认值24 })25 console.log(obj.addr); //=>上海26 for( var k in obj){ //=>name,age 因为上面addr的enumerable默认值是false,所以也是不可以枚举的27 console.log(k)28 }29 delete Foo.prototype.addr //=删除对象原型属性30 console.log(obj.addr) //=>上海 因为对象原型上属性特性configurable默认为false,所以是不可删除的31 </script>
第二种方式,当三大属性都为true时,又有什么不同?
1 <script> 2 //如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何 3 function Foo(){} 4 Foo.prototype.age = 22 5 var obj = new Foo() 6 obj.name = "ziksang" 7 Object.defineProperty(obj,"telephone",{ 8 value:15921848427, 9 writable:true,10 enumerable:true,11 configurable:true//这个语句的意思就是在obj对象上创建了一个telephone属性,设定它的值为15921848427,对它的三大属性都设为true12 })13 console.log(obj.telephone) //因为上面自定义时赋值为15921848427,所以获取值为159....14 obj.telephone = 110 //此处我修改其属性值15 console.log(obj.telephone) //结果输出结果还是110 因为writable是为true ,所以是可修改的16 for(var p in obj){ //此处输出结果为 name,telephone,age 因为用for in枚举的是对象自身属性和原型上的属性,为什么没有telephone呢?因为此时obj对象上属性的特性enumerable也是默认false17 console.log(p)18 }19 console.log(Object.keys(obj)) //此处输出结果为name,telephone因为用object.keys枚举的是对象自身的属性20 delete obj.telephone; //删除telephone属性21 console.log(obj.telephone) //因为自定义的属性特configurable为false 所以是可以删除的22 23 24 //对象上的原型也可以用此方法定义属性25 Object.defineProperty(Foo.prototype,"addr",{26 value:"上海",27 writable:true,28 enumerable:true,29 configurable:true//对象原型上自定义一个属性addr 三大特性都为true30 })31 console.log(obj.addr); //=>上海32 Foo.prototype.addr = "北京"33 console.log(obj.addr)//因为writable设为true,所以可以修改原型的属性,所以输出是北京34 for( var k in obj){ //=>name,age,addr 因为上面addr的enumerable为true,所以也是可以枚举的35 console.log(k)36 }37 delete Foo.prototype.addr //=删除对象原型属性38 console.log(obj.addr) //=>undefined 因为对象原型上属性特性configurable为true,所以是可删除的39 </script>
再来深入了解configurable配置项.
当configurable为flase时 对属性从定义其特性时writable,enumerable的情况如何?
1 <script> 2 //如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何 3 function Foo(){} 4 Foo.prototype.age = 22 5 var obj = new Foo() 6 obj.name = "ziksang" 7 Object.defineProperty(obj,"telephone",{ 8 value:15921848427, 9 writable:false,//如果把三大特性都设为false10 enumerable:false,11 configurable:false12 })13 Object.defineProperty(obj,"telephone",{14 writable:true, //再把writable 和enumerable再重新定义15 enumerable:true16 }) //结果以下都报错,返回空数组,原因是configurable是一个配置项,当配置项为false时,其它两个特性则不能被重新定义17 for(var p in obj){18 console.log(p)19 }20 console.log(Object.keys(obj))21 obj.name = "博客园"22 console.log(obj.name) 23 </script>
当configurable为true时 对属性从定义其特性时writable,enumerable的情况如何?
1 <script> 2 //如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何 3 function Foo(){} 4 Foo.prototype.age = 22 5 var obj = new Foo() 6 obj.name = "ziksang" 7 Object.defineProperty(obj,"telephone",{ 8 value:15921848427, 9 writable:false,//如果把configurable设为true,其它设为false时10 enumerable:false,11 configurable:true12 }) 13 Object.defineProperty(obj,"telephone",{14 writable:true, //再把writable 和enumerable再重新定义15 enumerable:true16 }) //以下都会返回结果,因可配置的特性configurable设为true,所以其它两个物性都可以从新定义为true 17 for(var p in obj){ //=>name,age ,telephone18 console.log(p)19 }20 console.log(Object.keys(obj)) //=>name,telephone21 obj.name = "博客园"22 console.log(obj.name) //=>博客园23 </script>
- js 中对象属性特性的描述
- js 中对象属性的特性
- JS修改属性的默认特性(属性描述符)
- js 中对象属性特性2
- JS属性特性(属性描述符)
- js 中对象的特性
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- JavaScript中对象属性的特性
- js 对象系列之属性描述符
- 虚拟对象的属性描述
- ES5中对象属性的访问描述符
- javascript中面向对象特性、对象的创建方式及对象属性的特性
- js中查看对象的属性(查看js对象)
- JS中document对象的location属性
- js中Math对象的属性方法
- JS中访问对象属性的方式
- 如何扩展 web 服务器?----阿里巴巴2015校招研发在线
- 数的计算
- Linux framebuffer example
- PiLC - S7 PLC for Raspberry Pi
- poj 1797 Heavy Transportation
- js 中对象属性特性的描述
- Linux虚拟机的三种网络连接方式
- 有两个32bit的数A、B,使用下面方式得到32bit的数C、D。哪一种可以使用C、D得到A、B的值?----阿里巴巴2015校招研发在线
- Yii2.0 上传图片
- Python Generators(生成器)——yield关键字
- 解决Mac OS lion下(ubuntu等linux也一样)启动tomcat的Cannot find ./catalina.sh 的问题
- innerHTML innerText outerHTML outerText的区别
- LaTex
- Linux内核通知链机制的原理及实现