js 中对象属性特性的描述
如何自定义属性的特性?
用对象.属性的特性和自定义的属性的特性有什么区别?
它的四大特性 writable enumerable configable 有什么区别?
先预习一个用对象.属性定义 ,属性的四大特性是以什么方式呈现的。
这时个属性的三大特性默认值都为true。
代码演示:
<script>
//用对象.属性定义的属性,它的三大特性都为true
function Foo(){}
Foo.prototype.age = 22
var obj = new Foo()
obj.name = "ziksang"
obj.addr = "上海"
obj.telephone = 15921848427
console.log(obj.name)//=>ziksang
obj.name = "博客园" //修改了name属性的值
console.log(obj.name) //=>博客园 因为此时定义的方式 writable为true,所以可以修改name的属性值
for( var p in obj){ //因为此时定义的方式,enumerable为true, 此时也是可以枚举的,
console.log(p) //用for in枚举可以把对象原型上的属性也枚举出来,因为原型上的属性也是用此定义属性,所以他的enumerable也为true
}
console.log(Object.keys(obj)) //用Object.keys(obj)方式枚举只能枚举对象自有的属性
delete obj.addr //删除对象上addr属性
console.log(obj.addr) //=>undefined 因为用此定义时他的configurable为true,所以是可以删除对象的
Foo.prototype.age = 33 //对于三大特性,我对原型上的属性只做了一个修改的特性,因为原型上定义的方式如果也是对象.属性定义的话,跟对象属性的三大特性一样,在此就不一一举例了
console.log(Foo.prototype.age) //=>33
</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.
第一种方式,当不设定三大属性时?
代码演示如下:
<script>
//如果用自定义Object.defineProperty方式来自定义属性的话,没有设置三大属性为true时,默认为false,看看在默认情况下会如何
function Foo(){}
Foo.prototype.age = 22
var obj = new Foo()
obj.name = "ziksang"
Object.defineProperty(obj,"telephone",{
value:15921848427 //这个语句的意思就是在obj对象上创建了一个telephone属性,设定它的值为15921848427,对它的三大属性没有任何设置,此时三大属性为默认false
})
console.log(obj.telephone) //因为上面自定义时赋值为15921848427,所以获取值为159....
obj.telephone = 110 //此处我修改其属性值
console.log(obj.telephone) //结果输出结果还是159....因为writable是默认值false,所以是不可修改的
for(var p in obj){ //此处输出结果为 name,age 因为用for in枚举的是对象自身属性和原型上的属性,为什么没有telephone呢?因为此时obj对象上属性的特性enumerable也是默认false
console.log(p)
}
console.log(Object.keys(obj)) //此处输出结果为name,因为用object.keys枚举的是对象自身的属性
delete obj.telephone; //删除telephone属性
console.log(obj.telephone) //因为自定义的属性特性默认值为false 所以是不可以删除的 //对象上的原型也可以用此方法定义属性
Object.defineProperty(Foo.prototype,"addr",{
value:"上海" //对象原型上自定义一个属性addr 三大特性都为默认值
})
console.log(obj.addr); //=>上海
for( var k in obj){ //=>name,age 因为上面addr的enumerable默认值是false,所以也是不可以枚举的
console.log(k)
}
delete Foo.prototype.addr //=删除对象原型属性
console.log(obj.addr) //=>上海 因为对象原型上属性特性configurable默认为false,所以是不可删除的
</script>
第二种方式,当三大属性都为true时,又有什么不同?
<script>
//如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何
function Foo(){}
Foo.prototype.age = 22
var obj = new Foo()
obj.name = "ziksang"
Object.defineProperty(obj,"telephone",{
value:15921848427,
writable:true,
enumerable:true,
configurable:true//这个语句的意思就是在obj对象上创建了一个telephone属性,设定它的值为15921848427,对它的三大属性都设为true
})
console.log(obj.telephone) //因为上面自定义时赋值为15921848427,所以获取值为159....
obj.telephone = 110 //此处我修改其属性值
console.log(obj.telephone) //结果输出结果还是110 因为writable是为true ,所以是可修改的
for(var p in obj){ //此处输出结果为 name,telephone,age 因为用for in枚举的是对象自身属性和原型上的属性,为什么没有telephone呢?因为此时obj对象上属性的特性enumerable也是默认false
console.log(p)
}
console.log(Object.keys(obj)) //此处输出结果为name,telephone因为用object.keys枚举的是对象自身的属性
delete obj.telephone; //删除telephone属性
console.log(obj.telephone) //因为自定义的属性特configurable为false 所以是可以删除的 //对象上的原型也可以用此方法定义属性
Object.defineProperty(Foo.prototype,"addr",{
value:"上海",
writable:true,
enumerable:true,
configurable:true//对象原型上自定义一个属性addr 三大特性都为true
})
console.log(obj.addr); //=>上海
Foo.prototype.addr = "北京"
console.log(obj.addr)//因为writable设为true,所以可以修改原型的属性,所以输出是北京
for( var k in obj){ //=>name,age,addr 因为上面addr的enumerable为true,所以也是可以枚举的
console.log(k)
}
delete Foo.prototype.addr //=删除对象原型属性
console.log(obj.addr) //=>undefined 因为对象原型上属性特性configurable为true,所以是可删除的
</script>
再来深入了解configurable配置项.
当configurable为flase时 对属性从定义其特性时writable,enumerable的情况如何?
<script>
//如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何
function Foo(){}
Foo.prototype.age = 22
var obj = new Foo()
obj.name = "ziksang"
Object.defineProperty(obj,"telephone",{
value:15921848427,
writable:false,//如果把三大特性都设为false
enumerable:false,
configurable:false
})
Object.defineProperty(obj,"telephone",{
writable:true, //再把writable 和enumerable再重新定义
enumerable:true
}) //结果以下都报错,返回空数组,原因是configurable是一个配置项,当配置项为false时,其它两个特性则不能被重新定义
for(var p in obj){
console.log(p)
}
console.log(Object.keys(obj))
obj.name = "博客园"
console.log(obj.name)
</script>
当configurable为true时 对属性从定义其特性时writable,enumerable的情况如何?
<script>
//如果用自定义Object.defineProperty方式来自定义属性的话,设置三大属性为true时,看看以下情况又会如何
function Foo(){}
Foo.prototype.age = 22
var obj = new Foo()
obj.name = "ziksang"
Object.defineProperty(obj,"telephone",{
value:15921848427,
writable:false,//如果把configurable设为true,其它设为false时
enumerable:false,
configurable:true
})
Object.defineProperty(obj,"telephone",{
writable:true, //再把writable 和enumerable再重新定义
enumerable:true
}) //以下都会返回结果,因可配置的特性configurable设为true,所以其它两个物性都可以从新定义为true
for(var p in obj){ //=>name,age ,telephone
console.log(p)
}
console.log(Object.keys(obj)) //=>name,telephone
obj.name = "博客园"
console.log(obj.name) //=>博客园
</script>
js 中对象属性特性的描述的更多相关文章
- js 中对象属性特性2
对象的存储描述: get 和 set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...
- js 中对象--属性相关操作
查询属性: 可以用 对象.属性 来查询属性和属性方法 或者 对象[“属性”] 来查询属性和属性方法 演示代码: <script ...
- js 中对象属性的特性
数据属性: 数据属性包含一个数据值的位置,在这个位置可以读取和写入值. 4个描述的行为特性: writable 表示能否修改属性的值.默认为true Enumerable 表示能否过过for in循 ...
- js 中对象的特性
用Object.definedproperties 一次性添加或修改多个属性的特性和值. <script> var obj ={} Object.defineProperties(obj, ...
- js中对象的一些特性,JSON,scroll家族
一.js中对象的一些特性 对象的动态特性 1.当对象有这个属性时,会对属性的值重写 2.当对象没有这个属性时,会为对象创建一个新属性,并赋值 获得对象的属性的方式 为元素设置DOM0级事件 二.JSO ...
- js中迭代元素特性与DOM中的DocumentFragment类型 笔记
JS中迭代元素特性 在需要将DOM结构序列化为XML或者HTML字符串时,多数都会涉及遍历元素的特性,这个时候attributes属性就可以派上用场. 以下代码展示了如何迭代元素的每一个特性,然后将他 ...
- Python中的属性访问与描述符
Python中的属性访问与描述符 请给作者点赞--> 原文链接 在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个nam ...
- 【转载】js中对象的使用
原文链接:http://www.jb51.net/article/90256.htm[侵删] 简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一 ...
- [转]JS中对象与字符串的互相转换
原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...
随机推荐
- linux设置LD_LIBRARY_PATH变量
在 Linux 下,如果你写好了自己的动态链接库,需要在其它程序里调用,则需要让这些程序能找到这些动态链接库.如果设置不对,会出现类似如下的错误: test: error while loading ...
- 解决DATASNAP远程方法参数超过32个的问题
群里有位同仁提出他有一个DATASNAP远程方法超过了32个参数,然后DELPHI编译通不过,提示方法参数不能超过32个,问怎么办?于是群内同仁纷纷出主意,我说用OLEVARINAT数组,有人说用RE ...
- 学习 opencv---(9)形态学图像处理(一):膨胀和腐蚀
本篇文章中,我们一起探究了图像处理中,最基本的形态学运算--膨胀与腐蚀.浅墨在文章开头友情提醒,用人物照片做腐蚀和膨胀的素材图片得到的效果会比较惊悚,毁三观的,不建议尝试.......... 一.理论 ...
- js获取几个月前,几周前时间。
/** * DK 命名空间 防止全局变量污染 */ var DK = {} ; /** * 获取前几个月,默认为一个月,当前时间 * @author duke * @date 格式为yy ...
- struts2标签 遍历map集合
首先我们来构造几个map集合. 假设如下代码 都是在ssh配置环境下搭建好,(至少struts2开发环境搭建好) (1).java 代码 下面的student对象包含的字段为 ...
- 【转】Android应用开发allowBackup敏感信息泄露的一点反思
转载:http://blog.csdn.net/yanbober/article/details/46417531 1 背景 其实这篇文章可能有些小题大作,但回过头想想还是很有必要的,有点阴沟里翻船的 ...
- Least Common Multiple
地址:http://www.codewars.com/kata/5259acb16021e9d8a60010af/train/python 题目: Write a function that calc ...
- 阿里云部署Docker(7)----将容器连接起来
路遥知马力.日久见人心.恩. 该坚持的还是要坚持. 今天看到一个迅雷的师弟去了阿里,祝福他,哎,尽管老是被人家捧着叫大牛.我说不定通过不了人家的面试呢.哎,心有惭愧. 本文为本人原创,转载请表明来源: ...
- Android框架之网络开发框架Volley
1. Volley简单介绍 我们平时在开发Android应用的时候不可避免地都须要用到网络技术.而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进 ...
- 关闭对话框,OnClose和OnCancel
我们知道,在对话框中,屏蔽ESC键自己主动退出能够选择重载OnCancel为哑函数的方法: void CXXXXDlg::OnCancel() { // TODO: Add ...