控制对象状态的方法:
1、Object.preventExtensions():防止对象扩展
2、Object.isExtensible():判断对象是否可扩展
3、Object.seal():禁止对象配置
4、Object.isSealed():判断一个对象是否可配置
5、Object.freeze():冻结一个对象
6、Object.isFrozen():判断一个对象是否被冻结
其他方法:
1、Object.setPrototypeOf():修改指定对象的原型
2、Object.getPrototypeOf():获取对象的原型类型
3、Object.fromEntries():
4、getOwnPropertySymbols
5、Object.observe方法用于观察对象属性的变化
对象属性模型的相关方法:
1、Object.getOwnPropertyDescriptor()
查看对象上的一个自有属性的描述。
语法: Object.getOwnPropertyDescriptor(obj, prop) //obj: 需要查找的目标对象, prop: 目标对象内属性名称
let user = {
name: 'hhh',
age: 18
}
let t1 = Object.getOwnPropertyDescriptor(user, 'name')
console.log('t1',t1)
attributes对象包含如下元信息:
| 特性 | 说明 | 默认值 |
|---|---|---|
| configurable | 能否使用 delete、能否需改属性特性、或能否修改访问器属性 | true |
| enumerable | 对象属性是否可通过 for-in 循环,或 Object.keys() 读取 | true |
| writable | 对象属性是否可修改 | true |
| value | 对象属性的默认值 | undefined |
2、Object.getOwnPropertyDescriptors()
查看对象所有属性的描述
Object.getOwnPropertyDescriptors(obj)//obj: 需要查找的目标对象
let user = {
name: 'hhh',
age: 18,
sex: '男'
}
let t2 = Object.getOwnPropertyDescriptors(user)
console.log('t2',t2)
3、Object.defineProperty()
直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法: Object.defineProperty(obj, prop, descriptor)
//obj: 需要被操作的目标对象 prop: 目标对象需要定义或修改的属性的名称 descriptor: 将被定义或修改的属性的描述符
let user = {
name: 'hhh',
age: 18,
sex: '男'
}
Object.defineProperty(user, 'name', {
configurable: false,
writable: false,
enumerable: false,
value: '张三'
})
console.log(user.name) // 张三
user.name = '我的名字'
console.log(user.name) // 张三 不能修改
console.log(Object.keys(user)); // ['age', 'sex'] 不能遍历
delete user.name;
console.log(user); // {age: 18, sex: '男', name: '张三'} 不允许删除
Object.defineProperty(user, "name", {
value: "重新配置",
writable: true,
enumerable: false,
configurable: false
}); //报错 不允许配置
4、Object.defineProperties()
定义一个对象的多个属性或修改现有属性,并返回该对象
语法:Object.defineProperties(obj,props)
//obj : 将要被添加属性或修改属性的对象。 props : 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
let user1 = {
name: 'hhh',
age: 18,
sex: '男'
}
Object.defineProperties(user1, {
name: {
configurable: false,
writable: false,
enumerable: false,
value: '张三'
},
age: {
configurable: false,
writable: false,
enumerable: false,
value: 28
}
})
console.log(user1)//{sex: '男', name: '张三', age: 28}
对象实例方法:
1、Object.assign()
将源对象的所有可枚举属性合并到目标对象上
2、Object.keys()
返回可枚举的属性
语法:Object.keys(obj)
let user1 = {
name: 'hhh',
age: 18,
sex: '男'
}
Object.defineProperties(user1, {
name: {
configurable: false,
writable: false,
enumerable: false,
value: '张三'
},
age: {
configurable: false,
writable: false,
enumerable: false,
value: 28
}
})
console.log(Object.keys(user1))//['sex']
3、Object.values()
方法返回一个给定对象自己的所有可枚举属性值的数组
语法:Object.values(obj)
//接上面 Object.keys() 例子
console.log(Object.values(user1))//['男']
4、Object.entries()
返回对象可枚举属性的键值对数组
语法:Object.entries(obj)
let user1 = {
name: 'hhh',
age: 18,
sex: '男'
}
Object.defineProperty(user, 'name', {
configurable: false,
writable: false,
enumerable: false,
value: '张三'
})
console.log(Object.entries(user1))// [['age', 18], ['sex', '男']]
5、Object.getOwnPropertyNames()
返回直接定义在某个对象上面的全部属性的名称
语法:Object.getOwnPropertyNames(obj)
let user = {
name: 'hhh',
age: 18,
sex: '男'
}
Object.getOwnPropertyNames(user, 'name', {
configurable: false,
writable: false,
enumerable: false,
value: '张三'
})
console.log(Object.getOwnPropertyNames(user)) //['name', 'age', 'sex']
6、hasOwnProperty()
方法会返回一个布尔值,指示对象自身属性(非继承属性)中是否具有指定的属性(也就是,是否有指定的键)
语法:obj.hasOwnProperty(prop) //要检测的属性的名称
let o = new Object();
o.hasOwnProperty('prop'); // 返回 false
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
delete o.prop;
o.hasOwnProperty('prop'); // 返回 false
无法通过obj.hasOwnProperty(prop)判断继承属性
function foo (){
this.sayhi=function(){
console.log('我是自身属性')
}
this.name='foo'
}
foo.prototype.saygoodbye='saygoodbye';
let myPro=new foo()
console.log(myPro.name) // foo
console.log(myPro.hasOwnProperty('name')) // true
console.log(myPro.hasOwnProperty('toString')) // false
console.log(myPro.hasOwnProperty('sayHi')) // true
console.log(myPro.hasOwnProperty('sayGoodBy')) // false
console.log('sayGoodBy' in myPro) // true :使用 `in` 可以在原型对象上检测