es(ECMAScript)中有两种属性:数据属性、访问器属性。用于设置对象属性(eg:name)的高级属性,比如该属性是否可删除、遍历、读写等。
一、数据属性
对象是由多个键值对组成的无序集合,对象中每个属性可以是任意类型的值。修改数据属性的默认特性,必须使用es5的Object.defineProperty()方法,修改多个数据属性特性时可使用Object.defineProperties()方法
数据属性特性:
Configurable:表示可否通过delete删除属性重新定义属性。默认为true,可以使用delete删除属性重新定义。
Enumerable:表示能否通过for-in循环返回属性。默认为true
Writable:表示能否修改属性的值。 默认为true
Value:表示这个属性的值
1、定义数据属性特性
Object.defineProperty()方法
语法:Object.defineProperty(obj(目标对象), prop(要修改或定义的属性名), descriptor(要定义的目标属性特性))三个参数都必须写
eg:
//student 目标对象 name要定义的属性 {...}要修改的数据属性特性
Object.defineProperty(sutdent,'name',{
configurable:true, //可删除属性
enumerable:true, //可返回属性值
writable:true, //可修改name的值
value:'zhangsan' //属性值
})
//sutdent目标对象必须存在
Object.defineProperties()方法
语法:Object.defineProperties(obj(目标对象), props(该对象要定义的一个或多个属性的数据属性特性))
var student = new Object();
Object.defineProperties(student, {
name: {
value: 'zhangsan',
configurable: false, //不可删除
writable: true,
enumerable: true
},
age: {
value: 18
}
})
delete student.name
console.log(student.name, student.age) // 打印结果zhangsan, 18
//delete student.name删除失败
2、获取属性特性
Object.getOwnPropertyDescriptor()
语法: Object.getOwnPropertyDescriptor(obj(目标对象), prop(要获取属性特性的属性名)) 功能:返回目标对象中某个属性的数据属性特性
var student = {
name: 'zhangsan',
age: 18,
height: 1.78
}
var res = Object.getOwnPropertyDescriptor(student, 'name');
var decs = Object.getOwnPropertyDescriptor(student, 'age');
console.log(res)
//{ value: 'zhangsan', writable: true, enumerable: true, configurable: true }
console.log(decs)
//{ value: 18, writable: true, enumerable: true, configurable: true }
Object.getOwnPropertyDescriptors()
语法: Object.getOwnPropertyDescriptors(obj(目标对象对象名)) 功能:返回目标对象所有自身属性的数据属性特性,如果目标对象为空对象,则返回一个空对象
var student = {
name: 'zhangsan',
age: 18,
}
var res = Object.getOwnPropertyDescriptors(student);
console.log(res)
//返回结果
{
name: { value: 'zhangsan', writable: true, enumerable: true, configurable: true },
age: { value: 18, writable: true, enumerable: true, configurable: true }
}
var student = {}
var res = Object.getOwnPropertyDescriptors(student);
console.log(res)
//返回结果为{}
二、访问器属性特性
访问器属性特性:
Configurable:表示能否通过delete删除属性从而重新定义属性,默认为false
Enumerable:表示能否通过for-in循环返回属性,默认为false
Get:在读取属性时调用的函数,默认值为undefined
Set:在写入属性时调用的函数,默认值为undefined
访问器属性:不包含数值,需要通过Object.defineProperty()方法定义
Object.defineProperty()
var book = {
_year: 2020, //下划线表示内部属性,只能通过对象的方法来读写
editor: 1
};
Object.defineProperty(book, 'year', {
get: function () {
return this._year;
},
// 若只指定get方法,不指定set方法,那就默认该属性是只读的
set: function (newYear) {
if (newYear !== this._year) {
this._year = newYear
this.editor ++
}
}
});
// 测试访问属性中的get,set方法
console.log('未修改的year:' + book.year);
book.year = 2021;
console.log('修改后的year:' + book.year);
console.log('修改year后的editor:' + book.editor);
// 问器属性可以通过Object.getOwnPropertyDescriptor()查询
console.log(Object.getOwnPropertyDescriptor(book, '_year'));
// { value: 2021, writable: true, enumerable: true, configurable: true }
三、对象序列化
什么是对象序列化?
对象序列化即是指将对象转换为Json字符串。同样的反序列化就是将Json字符串转换成对象
RegExp(正则表达式)、function、undefined值和Error对象不能序列化和反序列化
对象序列化
语法:JSON.stringify(obj) obj:表示目标对象
//将对象转换成JSON字符串
var student = {
name:'zhangsan',
age:18,
cj:[99,99,99,99]
};
console.log(student);
//student对象打印结果 { name: 'zhangsan', age: 18, cj: [ 99, 99, 99, 99 ] }
// 将对象转换为JSON字符串JSON.stringify(obj)
var json = JSON.stringify(student);
console.log(json);
//打印结果 {"name":"zhangsan","age":18,"cj":[99,99,99,99]}
对象反序列化
语法:JSON.parse(jsonStr) jsonStr:目标字符串
// 将JSON字符串转换为对象
var student = {
name:'zhangsan',
age:18,
cj:[99,99,99,99]
};
var json = JSON.stringify(student);
console.log(json); //{"name":"zhangsan","age":12,"cj":[99,99,99,99]}
// 将JSON字符串转换为对象 JSON.parse(jsonStr)
var obj = JSON.parse(json);
console.log(obj); //{ name: 'zhangsan', age: 18, cj: [ 99, 99, 99, 99 ] }