JS之对象
每个对象的属性有两种,每种属性有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属性 ...
随机推荐
- JStorm之Nimbus简介
本文导读: ——JStorm之Nimbus简介 .简介 .系统框架与原理 .实现逻辑和代码剖析 )Nimbus启动 )Topology提交 )任务调度 )任务监控 .结束语 .参考文献 附:JStor ...
- Leap Motion发布新平台,直击下一代移动端VR/AR手部追踪
2013年,动作捕捉技术公司Leap Motion发布了面向PC的体感控制器,不过销量并不乐观.随着2014年虚拟现实技术的再一次兴起,它发布一款用于Oculus Rift的附加设备,从而正式登上VR ...
- Let’s encrypt 计划为网站提供免费的基本 SSL 证书,以加速互联网从 HTTP 向 HTTPS 过渡。
Let’s encrypt 计划为网站提供免费的基本 SSL 证书,以加速互联网从 HTTP 向 HTTPS 过渡. 该项目由Mozilla.Cisco.Akamai.IdenTrust.EFF 和密 ...
- 目前quanben评十大哲学家
排名分先后,包含时间.地区和主要正面成就以及其他代表人物. 1. 伊曼努尔·康德:十八世纪:东普鲁士:理性的界限,现象和本体分立以及主体的地位2. 柏拉图:公元前三四百年:古希腊:理想(念)世界3. ...
- 关于加了hibernate 框架的项目启动特别慢的问题
今天突然遇到一个问题,就是加了hibernate 框架的项目在启动的时候,特别慢,竟然达到了4分多钟,查来查去,看到我的bean类里*.hbm.xml,有这样的写法: <?xml version ...
- python基础学习二——第二天
对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 一.int 首先我们来查看一下int包含了哪些函数 # python3.x dir(int) # ['__a ...
- (转)C#/.NET主线程与子线程之间的关系
一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑 主线程与子线程之间的关系 ...
- spring security 管理会话 多个用户不可以使用同一个账号登录系统
多个用户不能使用同一个账号同时登陆系统. 1. 添加监听器 在web.xml中添加一个监听器,这个监听器会在session创建和销毁的时候通知Spring Security. <listener ...
- SpringMVC如何接收application/json内容编码类型的参数?
在上代码之前,有必要先说说@ResquestBody注解的含义: 1.官方解释如下: Annotation indicating a method parameter should be bound ...
- 学Python后到底能干什么?
Python是一种什么语言? Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的Jav ...