对象
对象是一个包含相关数据和方法的集合
1.对象的创建
1.字面量模式
var obj = {
name:"terry",
age:12,
sayName:function(){
console.log("my name is ",this.name);
}
}
2.构造函数模式
var obj = new Object();
obj.name = "terry";
obj.age = 12;
obj.sayName = function(){
console.log("my name is",this.name);
}
2.对象的访问
1.属性的访问
点访问、中括号访问
obj.name //'terry'
obj['name'] //'terry'
name = "age"
obj['name'] //12
2.方法的访问
obj.sayName();//方法的使用
3.遍历对象中的属性
for…in 用于遍历数组或对象的属性
for(var key in obj){
var value=obj[key];
}
3.增删改对象属性
只能删除对象的自有属性
delete obj.pro
delete obj["proname"]
delete obj.sayName //从obj对象中删除sayName属性
新增属性
obj.newpropname="value"
改变属性值
obj.pro="newValue"
4.检测属性
in 检测是否是对象的自有属性或继承属性
var obj = {
name: 'zhangsan',
age: 18,
school: 'xx大学'
}
//in运算符的左侧为属性名称,右侧为对象
console.log('name' in obj); //true
console.log('gender' in obj); //false
console.log('toString' in obj); //true
Object.prototype.hasOwnProperty()
检测是否是对象的自有属性
console.log(obj.hasOwnProperty('name')); //true
console.log(obj.hasOwnProperty('toString')); //false,toString为继承属性
Object.prototype.propertyIsEnumerable()
检测是否是对象的自有属性和枚举属性(Enumerable:true)
console.log(obj.propertyIsEnumerable('name')); //true
5.对象原型属性和方法
Object 原型常用的方法
保存用户创建当前对象的函数,与原型对象对应的构造函数
hasOwnProperty(propertyName)
检查给定的属性名是否是对象的自有属性
propertyIsEnumerable(propertyName)
检查给定的属性在当前对象实例中是否存在
valueOf()
返回对象的字符串,数值,布尔值的表示
toLocaleString()
返回对象的字符串表示,该字符串与执行环境的地区对应
toString()
返回对象的字符串表示
isPrototypeOf(object)
检查传入的对象的原型
6.定义属性
数据属性
[[Configurable]]
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性
[[Enumerable]]
表示能否通过for-in循环返回属性,即是否可枚举
[[Writable]]
表示能否修改属性的值。(属性直接定义在对象中,默认为true)
[[Value]]
包含这个属性的数据值
Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)
var obj = new Object();
obj.name = 'zhangsan';
Object.defineProperty(obj,'name',{
configurable:true,//默认值
enumerable:true,//默认值
writable:true, //默认值
value:'terry'
})
Object.defineProperties(obj, props)
var obj = new Object();
Object.defineProperties(obj, {
name: {
value: 'zhangsan',
configurable: false
},
age: {
value: 18,
enumerable: true
}
})
读取属性
Object.getOwnPropertyDescriptor(obj,prop)
返回指定对象自有属性对应的属性描述符
var desc = Object.getOwnPropertyDescriptor(person, 'name');
console.log(desc) 结果如下
// {
// configurable: true,
// enumerable: true,
// writable: true,
// value: "zhangsan"
// }
Object. getOwnPropertyDescriptors(obj)
返回指定对象所有自有属性的描述符,若没有任何自身属性,则返回空对象。
访问器属性
不包含数据值,包含的是一对get和set方法,可模拟数据双向绑定
访问器属性包含的四个特性:
[[Configurable]]
表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false
[[Enumerable]]
表示能否通过for-in循环返回属性,默认为false
[[Get]]
在读取属性时调用的函数,默认值为undefined
[[Set]]
在写入属性时调用的函数,默认值为undefined
Object.defineProperty(obj,prop,otherobj)
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);//2020
book.year = 2021;
console.log('修改后的year:' + book.year);//2021
7.对象序列化
对象序列化是指将对象的状态转换为字符串,也可以反序列化,将字符串还原为对象函数
RegExp,Error对象,undefined值不能序列化和反序列化
JSON.stringify(obj) 将对象序列化为JSON字符串,只能序列化对象可枚举的自有属性
JSON.parse(jsonStr) 反序列化