es6-对象扩展(二)
关于原型
es6添加了__proto__属性来指向原型,__proto__大部分浏览器都部署了这个属性,但是其他环境不一定部署(node),所以es6提供了两种方法来去读和设置原型对象。
Object.setPrototypeOf()
用于设置对象的原型对象。
es5中实例和原型之间通过__proto__属性连接,但是其他环境不一定部署__proto__,所以es6提供Object.setPrototypeOf()方法来为对象设置原型。
function Person() {}
Person.prototype.name = 'uzi'
let person1 = new Person()
person1.name // name属性从原有的原型继承
// 'uzi'
let PersonPro = {name: 'xiaohu'} // 新的对象
Object.setPrototypeOf(person1, PersonPro) // 把person1指向原型的指针指向PersonPro
person1.name // name属性从新的原型继承
// 'xiaohu'
Object.getPrototypeOf()
该方法与Object.getPrototypeOf()配套,用于获取对象的原型对象。
// 上个例子中的person1的原型
Object.getPrototypeOf(person1)
// {name: "xiaohu"}
for…in与Object.keys()
二者都是遍历对象中可枚举属性,区别是for…in除遍历对象自身的属性外继承的属性也会遍历,而Object.keys()这关注对象自身的可枚举属性。
function Person(){}
Person.prototype.age = 45
let person1 = new Person()
person1.name = 'uzi'
// for..in遍历
for (let i in person1) {console.log(i)}
// name
// age
// Object.keys()遍历
Object.keys(person1)
//["name"]
Object.values()、Object.entries()
和Object.keys()一套的东西,用法相同,values遍历值,entries遍历键值对
Object.getOwnPropertyDescriptors()
es5中Object.getOwnPropertyDescriptor()方法返回对象某个属性的描述对象,而Object.getOwnPropertyDescriptors()返回对象自身所有属性(非继承属性)的描述对象。
let person = {
name: 'uzi',
age: 45
}
// es5中Object.getOwnPropertyDescriptor()方法
Object.getOwnPropertyDescriptor(person, 'name')
// {value: "uzi", writable: true, enumerable: true, configurable: true}
// es6中Object.getOwnPropertyDescriptors()方法
Object.getOwnPropertyDescriptors(person)
// {
// age: {value: 45, writable: true, enumerable: true, configurable: true}
// name: {value: "uzi", writable: true, enumerable: true, configurable: true}
// }
扩展运算符
扩展运算符(…)用于取出参数对象的所有可遍历属性,并将其复制到当前对象之中。
let person = {
name: 'uzi',
age: 45
}
let firend = {job: 'web', ...person}
console.log(firend)
// {job: "web", name: "uzi", age: 45}
可以合并两个对象
let a = {a: 11}
let b = {b: 22}
let ab = {...a, ...b}
console.log(ab)
// {a: 11, b: 22}