对象的增删改查
// 使用字面量的形式实例化 Object 对象
var obj1 = {
myName: '周正国'
};
添加属性
obj1.age = 20;
obj1['gender'] = '男';
修改属性的值
obj1.age += 1;
访问属性
obj1['myName']
obj1.myName
删除属性
delete obj1.age;
遍历对象中的属性
- for in 遍历
- Object.keys(要遍历的对象)
构造函数.方法=function(){} 可以不用实例化对象就可以通过**构造函数.方法()**来调用,如上。
对象属性
- 数据属性 保存的是数据 属性名:属性值的方式
- 访问器属性 通常用于隐藏数据 用get,set 方法来获取或者设置属性
对象的方法
判断一个属性是否在对象中
-
in 操作符 属性名 in 对象名 hasOwnProperty()
-
对象名.hasOwnProperty(属性名)
区别:2只会在对象的自有属性列表中查找,而1不仅会在自有属性列表下查找,还会沿着原型链查找。
判断某个属性是否可枚举
对象.propertyIsEnumerable()
判断一个对象是否是另一个对象的原型
原型.isPropertyOf(对象)
属性的特性
获取属性的特性
我们可以通过以下方式获取一个或多个属性的特性
- Object.getOwnPropertyDescriptor(对象名,要获取的属性名) 获取对象中该属性的特性
- Object.getOwnPropertyDescriptors(对象名) 获取对象中所有的属性的特性
如下图代码打印一下它们获取到的特性
var student={
studentName:"大雨",
age:20,
play:function(){
console.log("打豆豆")
}
}
var stu1=Object.getOwnPropertyDescriptor(student,"age");
var stu2=Object.getOwnPropertyDescriptors(student);
console.log(stu1);
console.log(stu2);
可以看到得到的是一个对象,那么可以看到它的特性有四个
- configurable 是否可配置
- enumerable 是否可枚举
- value 属性值
- writable 是否可写
当然它们默认都是 true 。我们也可以去控制这些特性。
控制属性的特性
- Object.defineProperty(对象名,属性,{修改特性的值 }) -----> 控制一个属性的值
- Object.defineProperties(对象名,{属性名:{修改特性的值},属性名:{修改特性的值}}) -----> 控制一个属性的值
Object.defineProperty(student,"age",{
value:18,
configurable:false,
enumerable:false,
writable:false
})
Object.defineProperties(student,{
gender:{
value:"女",
configurable:true,
enumerable:false,
writable:false
},
num:{
value:01,
configurable:false,
enumerable:false,
writable:true
}
})
console.log(Object.getOwnPropertyDescriptor(student,"age"))
console.log(Object.getOwnPropertyDescriptors(student))
所以我们也可以利用这种方式添加属性或者修改属性值,同时设置属性的特性
禁止对象扩展
查询对象是否可被扩展 Object.isExtensible(要查询的对象名) 默认都为true。
禁止对象扩展 Object.preventExtensions(要禁止的对象名)
禁止对象扩展的特性:不可向对象中添加新的属性
对象封印
判断对象是否被封印 Object.isSealed(要查询的对象名)
封印对象 Object.seal(要封印的对象名)
对象被封印后的特性:不可删除属性,不可添加新属性,可以修改属性值。
所有被封印对象的属性的特性都被设置了:configurable: false
冻结对象
判断对象是否被冻结 Object.isFrozen(要查询的对象名)
封印对象 Object.freeze(要封印的对象名)
对象被封印后的特性:不可删除属性,不可添加新属性,不可修改属性值。