ES6学习之对象
学习ES6对象的一些新属性,主要参照ES6标准入门一书。
方法的name属性
对对象中的方法使用==name==属性,会返回方法名。对方法中的==get,set==函数使用name属性,会返回==get/set+方法名==。
var person = {
sayName () {
console.log(this.name);
},
get firstName () {
return 'lalalala';
}
}
person.sayName.name // "sayName"
person.firstName.name // "get firstName"
Object.is()
==Object.is==方法和===严格比较运算符具有相同的效果。除了对+0和-0,还有NaN的表现效果不一致。
+0 === -0 // true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
Object.assign()
==Object.assign==方法只是简单的用后面对象的属性,替换前面对象的相应属性,并不具备“深拷贝”的功能。假如有多个对象的时候,后面的对象会一次替换前面对象的属性。替换后的属性,引用相同的引用类型。
该方法有很多用途:
1. 为对象添加属性
class Point {
constructor (x, y) {
Object.assign(this, {x, y});
}
}
- 为对象添加方法
Object.assign(SomeClass.prototype, {
someMethod () {
...
},
anotherMethod () {
...
}
});
- 克隆对象
function clone (origin) {
let originProto = Object.getPtototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
}
- 合并多个对象
const merge = (target, ...sources) => Object.assign(target, ...sources);
属性的可枚举性
对象的每个属性都有一个描述对象(Descriptor)。==Object.getOwnPropertyDescriptor==方法可以获取该属性的描述对象。
let obj = { foo: 123};
Object.getOwnPropertyDescriptor(obj, 'foo');
// { value: 123, //值
// writable: true, //是否可写
// enumerable: true, //可枚举性
// configurable: true //是否可以修改以上属性}
es6中,所有对象的class方法都是不可枚举的。
对象属性的遍历
- for…in返回自身和继承的可枚举属性(不含Symbol)
- Object.keys返回一个数组,包含自身的可枚举(不含继承和Symbol)
- Object.getOwnPropertyNames(obj)返回数组,包含所有属性(不含继承和Symbol,但包含不可枚举)
- Object.getOwnPropertySymbols(obj)返回数组,包含Symbol
- Reflect.ownKeys(obj)返回数组,包含自身所有(含Symbol,含不可枚举)
- Reflect.enumerate(obj)返回一个Iterator对象,其他与fot…in相同
__proto__属性
这个属性没有写入es6正文,标准规定只有浏览器必须部署,其他环境不一定要部署。所有,最好不要使用这一属性,而是使用替代属性如==Object.setPrototypeOf(),Object.getPrototypeOf()或Object.create()==。