一、Object的实例方法(原型上的方法)和静态方法(构造器方法)
1、查看静态方法:Object.getOwnPropertyDescriptors(Object);
2、查看实例方法:Object.prototype
二、对象属性描述:
var obj = { a:'七鸽' }
console.log(Object.getOwnPropertyDescriptor(obj,'a'));
2-1、configurable:为false时对象的属性不可删除,也就是delete操作符无效(在严格模式下报TypeError),通过getOwnPropertyDescriptor定义的属性,默认值为false,常规设置默认值为true;
'use strict'
var obj = { a: '七鸽' }
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
Object.defineProperty(obj, 'a', {
configurable: false
})
delete obj.a
2-2、enumerable:为false时对象的属性不可枚举,也就是for in和Object.keys获取不到该属性,通过getOwnPropertyDescriptor定义的属性,默认值为false,常规设置默认值为true;
'use strict'
var obj = { a: '七鸽',b:'舞载' }
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
Object.defineProperty(obj, 'a', {
enumerable: false
})
console.log(Object.keys(obj));//["b"]
for (let key in obj) {
console.log(key);//b
}
2-3、writable:为false时对象的属性不可重新赋值(在严格模式下报TypeError),通过getOwnPropertyDescriptor定义的属性,默认值为false,常规设置默认值为true;
'use strict'
var obj = { a: '七鸽' }
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
Object.defineProperty(obj, 'a', {
writable: false
})
oba.a='舞载'
三、重写属性get/set 方法:
var a='七鸽';
var obj = { a}
Object.defineProperty(obj, 'a', {
get() {
console.log('hello get');
return a
},
set(value) {
console.log('hello set');
return a = value
}
})
console.log(obj.a);//hello get 七鸽
obj.a = '舞载';//hello set
console.log(obj.a);//hello get 舞载
四、对象密封
4-1: 阻止对象拓展:Object.preventExtensions(obj),
判断对象是否可拓展:Object.isExtensible((obj) 返回bool值
4-2: 对象密封:Object.seal(obj);
判断对象是否密封:Object.isSeal((obj) 返回bool值;
底层调用:preventExtensions、isSeal
4-3:浅度冻结 对象冻结:Object.freeze(obj);
判断对象是否冻结:Object.isFrozen((obj) 返回bool值;
五、同值相等(sameValue算法===)
Object.is(NaN,NaN);//true
Object.is(+0,-0);//false
五:对象合并Object.assign(tar,origin),浅拷贝对象
console.log(Object.assign(obj1,'12'));//{0: "1", 1: "2", a: "七鸽"}
// console.log(Object.assign(obj1,1));//{a: "七鸽"}
// console.log(Object.assign(1,obj1));//Number {1, a: "七鸽"}
// console.log(Object.assign(null,obj1));//TypeErroe
// console.log(Object.assign(undefined,obj1));//TypeErroe
console.log(Object.assign(obj1,null));//{a: "七鸽"}
console.log(Object.assign(obj1,undefined));//{a: "七鸽"}
5-1、tar如果是原始值类型,会进行对应包装类隐式转换成对象,如果没有对应的包装类则抛出TypeError,如null、undefined
5-2、origin如果是原始值类型,会进行对应包装类隐式转换成对象,如果没有对应的包装类则不做处理,由于Number和Boolean的值没有对应的键,String的包装类的值有对应的键(字符所在的下标)