JavaScript的世界,万物皆对象,ES6对对象有一些很大的升级。数组
属性简介表示:bash
容许直接写入变量和函数,属性名为变量名,属性值为变量值:函数
var a = 1;var b = 2;
console.log({a, b})//{a: 1, b: 2}
复制代码
方法简写应该就不用多说了:ui
getData(){
}
复制代码
使用exports的时候咱们就常常用:this
var a = function(){}
var b = function(){}
module.exports = {
a: a,
b: b
}
复制代码
等同于:spa
module.exports = {a, b}
复制代码
属性名:code
对象使用字面量方式定义属性只有一种方法:对象
var obj = {
a: 1
}
复制代码
ES6支持表达式做为对象的属性名:ip
var a = 'test';
var obj = {
[a]: 1
}
console.log(obj);//{test: 1}
复制代码
函数name属性在函数扩展说过了,对象的函数如今也有name属性。get
属性可枚举和遍历:
对象有一个描述对象,经过Object.getOwnPropertyDescriptor方法能够获取:
var obj = {
a: 1
}
console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
//{value: 1, writable: true, enumerable: true, configurable: true}
复制代码
enumberable是可枚举属性,若是是false,某些操做就会忽略当前的属性:
var obj = {
a: 1,
b: 2
}
Object.defineProperty(obj, 'a', {
enumerable: false
})
for(let val in obj){
console.log(val);//b
}
复制代码
目前有四个方法会把不可枚举的忽略:
for...in循环、Object.keys()、JSON.stringify()、Object.assign()这四个方法都会不遍历不可枚举的属性。前三个是ES5的,最后一个是ES6的。
可枚举属性就是为了让某些属性能够不被枚举,好比length、toString等,咱们是但愿不被循环出来的。ES6的Class原型的方法都是不可枚举的。
遍历对象属性键名有五种方法:
For in不含symbol
Object.keys()返回数组,不包含symbol
Object.getOwnPropertyNames()返回数组,不可枚举的也包括,不包括symbol
Object.getOwnPropertySymbols()返回数组,全部symbol的键名。
Reflect.ownKeys()返回数组,包括全部的键名,无论可枚举不可枚举。
super关键字,这边说一下,JavaScript引擎如今只能识别对象方法的简写定义的是对象方法:
var obj = {
test() {
}
}
复制代码
super关键字只能用在对象方法中,指向当前对象的原型对象,但只是当前对象,this的指向是不变的:
var proto = {
a: 'a',
b: 'a'
};
var obj = {
a: 'b',
b: 'b',
test() {
console.log(this.b);//b
return super.a;
}
};
Object.setPrototypeOf(obj, proto);
console.log(obj.test()); // "a"
复制代码
扩展运算符和结构赋值,以前有说过,这边就分享几个点:
解构赋值是浅拷贝
扩展运算符的解构不能复制原型的属性
var o = Object.create({ x: 1, y: 2 });
o.z = 3;
let { x, ...newObj } = o;
console.log(newObj);//{z: 3}
复制代码
ES6对对象新增了不少方法:
Object.is()跟严格相等(===)同样,多加了两个不一样,+0不等于-0和NAN等于NAN。
console.log(+0 === -0); //true
console.log(NaN === NaN); // false
console.log(Object.is(+0, -0)); // false
console.log(Object.is(NaN, NaN)); // true
复制代码
Object.assign,我以为这个方法不用多介绍,就是合并对象到第一个参数。须要注意的是,参数放后面的,若是属性相同,会被后面的覆盖。
Undefined和null当作首参数会报错,不是对象的会转成对象返回,非对象的参数不在第一个,不能转成对象就会跳过。布尔值和数字也会跳过。且只会拷贝可枚举的自身属性。
assign方法是浅拷贝,函数是没法复制的。
ES2017引入Object.getOwnPropertyDescriptors(),返回全部对象属性的描述:
const obj = {
foo: 'world',
find() {
return super.foo;
}
};
console.log(Object.getOwnPropertyDescriptors(obj));
find:
configurable: true
enumerable: true
value: ƒ find()
writable: truefoo:
configurable: true
enumerable: true
value: "world"
writable: true
复制代码
ES2015的Object.getOwnPropertyDescriptor()是获取某一个。
Object.setPrototypeOf()(写操做)
Object.getPrototypeOf()(读操做)
Object.create()(生成操做)
这三个方法都是对原型的操做,好比set就是改变原型的指向:
var proto = {};
var obj = { a: 1 };
Object.setPrototypeOf(obj, proto);
proto.b = 20;
console.log(obj.b);//20
复制代码
Obj的原型指向了proto。
ES5的Object.keys(),ES2017的Object.values(),Object.entries(),这三个方法都是返回数组,一个是键值,一个是属性值,一个是键值对。包含可枚举且不是symbol的自身属性。
Object.fromEntries()是Object.entries()的逆操做,把键值对的数组变成对象:
console.log(Object.fromEntries([ ['a', 'a'], ['b', 'b']]));
//{a: "a", b: "b"}
复制代码