目录
1.Object.getOwnPropertyNames(obj)
2.Object.prototype.hasOwnProperty()
一. 创建对象
1.Object.create(obj)
- 以obj为原型,生成一个对象实例,该实例继承了obj的所有属性和方法
- 使用Object.create()方法时,必须提供对象原型,即参数不能为空,或者不是对象,否则会报错
- Object.create()方法还可以接受第二个参数。该参数是一个属性描述对象,它所描述的对象属性,会添加到实例对象,作为该对象自身的属性
二. 读写原型
1.Object.setPrototypeOf()
Object.setPrototypeOf(obj,proto)
// 第一个参数是目标对象
// 第二个参数是原型
- 如果第一个参数不是对象,会自动转为对象。但由于返回的是第一个参数,所以这个操作不会产生任何效果
- 由于undefined和null无法转为对象,所以如果第一个参数是undefined或null,就会报错
2.Object.getPrototypeOf()
用于读取对象的原型对象,如果参数不是对象,会被自动转为对象,undefined或null会报错
Object.getPrototypeOf(obj);
三. 访问属性
1.Object.getOwnPropertyNames(obj)
方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性的键名。
2.Object.prototype.hasOwnProperty()
对象实例的hasOwnProperty方法返回一个布尔值, 用于判断某个属性是否定义在该对象自身。
Date.hasOwnProperty('length') //true
Date.hasOwnProperty('toString') //false
3.in 运算符和 for...in 循环
in运算符会返回一个布尔值,表示一个对象是否具有某个属性,包含自身和继承的可枚举属性
'length' in Date //true
'toString' in Date //true
for...in获得对象的所有可枚举属性(自身和继承的)
let o1 = {p1:'123'};
let o2 = Object.create(o1,{p2:{value:'abc',enumerable:true}});
for(let p in o2){
console.log(p)
}
//p2
//p1
4.Object.keys(obj)
方法返回一个数组,成员是参数对象自身的所有可遍历属性的键名
let obj = {foo:'123',bar:'abc'};
Object.keys(obj);
//['foo','bar']
Object.values(obj)返回数组,包含对象自身的所有可遍历属性的键值
Object.entries(obj)返回数组,包含对象自身的所有可遍历属性的键值对数组
四. 合并对象Object.assign()
1. 基本用法
Object.assign(target,source1,source2);
//将源对象(source)的所有可枚举属性,复制到目标对象(target)
//Object.assign()的第一个参数是目标对象,后面的参数都是源对象
//如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
let obj = {foo:'bar'}
Object.assign(obj) === obj; //true
//如果只有一个参数,会直接返回该参数
typeof Object.assign(2); // "object"
//如果参数不是对象,会先转成对象然后返回
Object.assign(undefined) // 报错
Object.assign(null) // 报错
//udefined和null无法转成对象,所以作为参数时,会报错
let obj = {a: 1};
Object.assign(obj, undefined) === obj // true
Object.assign(obj, null) === obj // true
//非对象参数出现在源对象的位置,若无法转成对象,则被忽略
//简单类型的值(数值、字符串、布尔值),不在首参数也不会报错,
//但只有字符串会以数组形式拷贝入目标对象,其他值不会有效果
2. 注意点
浅拷贝:源对象的某个属性的值是对象,则目标对象拷贝的是这个对象的引用
取值函数的处理:如果要复制的值是一个取值函数,那么将会求值后再复制