Object类型
描述
- object类型对象是所有其他类型对象的父级
使用Object创建对象
/* 表示使用构造函数方式创建一个空对象 */
var obj1 = new Object();
console.log( obj1 );// 显示 {}
/* Object可以根据一个给定值创建一个对应类型的对象 */
var obj2 = new Object( 100 );// 创建一个number类型的对象
console.log( obj2 );// 显示 [Number: 100]
var obj3 = new Object( '啊哈哈' );// 创建一个string类型的对象
console.log( obj3 );// 显示 [String: '啊哈哈']
属性描述符
- 表示对象的属性或方法的内部数据结构
-
用于描述对象的值,或控制值的行为
- 比如: 是否可修改 是否可删除 是否可枚举
属性描述符的分类
- 数据描述符
- 存取描述符
获取属性描述符
- Object.getOwnPropertyDescriptor()方法
- 通过该方法可以获取到指定属性或方法的属性描述符
-
该方法接收两个参数
- 第一个 - 需要查找属性的目标对象
- 第二个 - 目标对象中需要查找的属性名称( string类型 )
- 该方法会将查找的结果,以对象的方式返回
var obj = {
ahh : '啊哈哈'
}
var ahh = Object.getOwnPropertyDescriptor( obj, 'ahh' );
console.log( ahh );
/* 显示 {
value: '啊哈哈', - 表示 属性或方法对应的值
writable: true, - 表示 是否可修改,值为boolean类型,true表示可以,false表示不可以,默认值为 false
enumerable: true, - 表示 是否可枚举,值为boolean类型,true表示可以,false表示不可以,默认值为 false
configurable: true - 表示 是否可删除,值为boolean类型,true表示可以,false表示不可以,默认值为 false
} */
属性描述符的value属性
- 可以对指定对象添加新属性或方法
- 可以对指定对象中已有的属性或方法进行修改
Object.defineProperty()方法
-
该方法接收三个参数
- 第一个 - 表示指定的对象
-
第二个 - 表示指定对象中的属性名称,字符串格式
- 修改就填已存在的
- 新增就直接写新名
- 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
ahh : '啊哈哈'
}
/* 修改属性 */
console.log( obj.ahh );// 显示 啊哈哈
/* 对已有属性进行修改 */
Object.defineProperty( obj, 'ahh', {
value : '哈哈啊'
} );
/* 显示修改后的属性 */
console.log( obj.ahh );// 显示 哈哈啊
/* 添加属性 */
console.log( obj );// 显示 { ahh: '哈哈啊' }
/* 添加新属性 */
Object.defineProperty( obj, 'ooo', {
value : '哦哦哦',
/*
设置是否可枚举
* 用于打印对象时可以正常显示新增的属性
* 不设置可枚举时将无法显示新增属性,只显示原有属性
* 显示 { ahh: '哈哈啊' }
*/
enumerable : true
} );
/* 显示新增属性 */
console.log( obj );// 显示 { ahh: '哈哈啊', ooo: '哦哦哦' }
/* 调用新属性 */
console.log( obj.ooo );// 显示 哦哦哦
/*
注意:
* 通过Object.defineProperty()方法新增的属性
* 该属性 - 不可修改 不可删除 不可枚举
* 通过 对象名.属性名 = 属性值 的方法新增的属性
* 该属性 - 可以修改 可以删除 可以枚举
*/
属性描述符的writable属性
- 表示指定属性或方法是否可修改
-
该属性值为boolean值
- true - 表示可修改
- false - 表示不可修改
Object.defineProperty()方法
-
该方法接收三个参数
- 第一个 - 表示指定的对象
- 第二个 - 表示指定对象中的属性名称,字符串格式
- 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
ahh : '啊哈哈'
}
/* 修改已有属性 */
Object.defineProperty( obj, 'ahh', {
value : '哈哈啊',
writable : false // 不可修改
} );
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 不可修改 */
obj.ahh = '啊啊啊';
console.log( obj.ahh );// 显示 哈哈啊
/* 设置writable属性后在修改属性 - 可修改 */
Object.defineProperty( obj, 'ahh', {
writable : true // 可修改
} );
obj.ahh = '啊啊啊';
console.log( obj.ahh );// 显示 啊啊啊
属性描述符的configurable属性
- 表示指定属性或方法是否可枚举
-
该属性值为boolean值
- true - 表示可枚举
- false - 表示不可枚举
Object.defineProperty()方法
-
该方法接收三个参数
- 第一个 - 表示指定的对象
- 第二个 - 表示指定对象中的属性名称,字符串格式
- 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
ahh : '啊哈哈'
}
Object.defineProperty( obj, 'ahh', {
enumerable : false// 不可枚举
} );
console.log( obj.ahh );// 显示 啊哈哈
/*
* 只能遍历对象中可被枚举的属性
* for...in语句
* keys()方法
* 可以遍历对象中可枚举和不可枚举的属性
* getOwnPropertyNames()方法
*/
/* for...in语句 */
for ( var i in obj ) {
console.log( i );
}// 没有显示
/* keys()方法 */
var obj1 = Object.keys( obj );
console.log( obj1 );// 显示 []空数组
/* getOwnPropertyNames()方法 */
var obj2 = Object.getOwnPropertyNames( obj );
console.log( obj2 );// 显示 [ 'ahh' ]
属性描述符的configurable属性
- 表示指定属性或方法是否可删除
-
该属性值为boolean值
- true - 表示可删除
- false - 表示不可删除
Object.defineProperty()方法
-
该方法接收三个参数
- 第一个 - 表示指定的对象
- 第二个 - 表示指定对象中的属性名称,字符串格式
- 第三个 - 表示属性描述符,必须是对象格式 { }
/* 定义一个对象 */
var obj = {
ahh : '啊哈哈'
}
/* 修改已有属性 */
Object.defineProperty(obj, 'ahh', {
configurable : false // 不可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
console.log(obj.ahh);// 显示 啊哈哈
Object.defineProperty(obj, 'ahh', {
configurable : true // 可删除
});
/* 删除ahh属性值 */
delete obj.ahh;
/* 在调用已删除的属性会报错 */
console.log(obj.ahh);// 显示 TypeError: Cannot redefine property: ahh
属性描述符的存取器
/* 定义一个对象 */
var obj = {
ahh : 'ahh'
}
/* 定义一个全局变量 */
var quanju;
Object.defineProperty(obj, 'ahh', {
// 获取指定的属性值
get : function(){// 当获取或访问当前属性时,会调用get方法
/*
类似于数据描述符中的value
* get方法在被调用时,不能传递任何参数
* get方法在被调用时,允许传递this关键字
* this - 表示当前的目标对象(不能调用对象的当前目标属性)
*/
return quanju;// 由于变量为初始化,调用时可能结果为 undefined
},
/*
set方法用于定义当前目标属性的修改作用
* 该方法接收唯一的一个参数 -> 作为当前目标属性的新的值
* 通过属性修改操作指定的新的值 -> 作为形参对应的实参
*/
set : function(canshu){
/*
set方法在被调用时,允许传递this关键字
* this - 表示当前的目标对象(不能调用对象的当前目标属性)
*/
quanju = canshu;
}
});
console.log(obj.ahh);// 显示 undefined
obj.ahh = '啊啊啊';
console.log(obj.ahh);// 显示 啊啊啊
禁止扩展
- 表示不能添加新的属性或方法
Object.preventExtensions()方法
- 表示禁止扩展
Object.isExtensible()方法
-
表示用于判断指定对象是否可扩展
- true - 表示可扩展
- false - 表示不可扩展
/* 定义一个空对象 */
var obj = {};
/* 设置禁止扩展 */
Object.preventExtensions( obj );
/* 添加新属性 */
obj.ahh = '啊哈哈';
console.log( obj );// 显示 {}空对象
/*
使用Object.defineProperty()方法进行新增属性会报错
* TypeError: Cannot define property:name, object is not extensible.
*/
Object.defineProperty(obj, 'ahh', {
value : '啊哈哈'
});
console.log( obj );// 显示 Cannot define property ahh, object is not extensible
/* 判断指定对象是否可扩展 */
var panduan = Object.isExtensible( obj );
console.log( panduan );// 显示 false
密封对象
- 表示不能添加新的属性或方法,也不能对已有的属性或方法进行修改
Object.seal()方法
- 表示密封对象
Object.isSealed()方法
-
表示用于判断指定对象是否密封
- true - 表示密封
- false - 表示没密封
var obj = {
ahh : '啊哈哈' // 表示可修改
};
console.log( Object.getOwnPropertyDescriptor( obj, 'ahh' ) );
/*
将该对象进行密封
1.不能为该对象新增属性或方法
2.不能修改该对象的属性或方法的描述符
* configurable
* enumerable
*/
/* 密封对象 */
Object.seal( obj );
console.log( Object.getOwnPropertyDescriptor( obj, 'ahh' ) );
/* 判断指定对象是否密封 */
var panduan = Object.isSealed( obj );
console.log( panduan );// 显示 true
冻结对象
- 表示禁止对指定对象的任何修改操作
Object.freeze()方法
- 表示冻结对象
Object.isFrozen()方法
-
表示用于判断指定对象是否冻结
- true - 表示冻结
- false - 表示没冻结
var obj = {
ahh : '啊哈哈'
}
/* 冻结对象 */
Object.freeze( obj );
/*
对已经冻结的对象使用Object.defineProperty()方法进行操作
* 会报错
* TypeError: Cannot define property age, object is not extensible
*/
Object.defineProperty( obj, 'age', {
value : 18
} );
console.log( obj );//显示 Cannot define property age, object is not extensible
/* 判断指定对象是否密封 */
var panduan = Object.isFrozen( obj );
console.log( panduan );// 显示 true
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。