新增的对象字面量语法
- 成员速写
对于如下这个情形的对象,es6有了速写的方法
function createUser(loginId, loginPwd, nickName) {
return {
loginId: loginId,
loginPwd: loginPwd,
nickName: nickName,
id: Math.random()
}
}
如果对象字面量初始化时,成员的名称来自于一个变量,并且和变量的名称相同,则可以简写(只写属性名即可)
function createUser(loginId, loginPwd, nickName) {
return {
loginId,
loginPwd,
nickName,
id: Math.random()
}
}
console.log(createUser("abc", "123", "aaa"));
上面两种写法是等效的,而es6的写法更简洁,同时变量的赋值也可以是一个函数,如下例这样
function createUser(loginId, loginPwd, nickName) {
const sayHello = function() {
console.log("loginId", this.loginId, "nickName", this.nickName);
}
return {
loginId,
loginPwd,
nickName,
sayHello,
id: Math.random()
}
}
const u = createUser("abc", "123", "aaa");
u.sayHello();
- 方法速写 对象字面量初始化时,方法可以省略冒号和function关键字
const user = {
name: "钟南山",
age: "100",
// sayHello:function(){
// console.log(this.name,this.age);
// }
sayHello() {
console.log(this.name, this.age);
} //等效于上面写法,只是一个语法糖,写起来更加轻松一些,本质是没有区别
}
user.sayHello();
- 计算属性名 初始化对象时,某些属性名可能来自于某个表达式的值,在es6,可以使用中括号来表示该属性名是通过计算得到的。
const prop1 = "name";
const prop2 = "age";
const prop3 = "sayHello";
const user1 = {
}
user1[prop1] = "钟南山";
以前只能初始化以后添加,像例子中user1[prop1] = "钟南山"
这样添加,
现在es6中初始化的时候,就可以使用计算属性名了
const user2 = {
[prop1]: "钟南山",
[prop2]: "100",
[prop3]() {
console.log(this[prop1], this[prop2]);
}
}
user2[prop3]();
// 属性名是通过表达式计算出来的
es6中对象新增的API
Object新增的API 有 Object.is 、 Object.assign 、Object.getOwnPropertyNames的枚举顺序 、 Object.setPrototypeOf等
对象也是构造函数,这些都是静态方法,直接附着在函数上的方法
- Object.is 用于判断两个对象是否相等
用全等判断两个对象是否相等时
console.log(NaN === NaN); //false
console.log(+0 === -0) //true 计算机里它们的二进制存储位是不一样的
为了有 更符合常理的相等判断,而且不改变原来全等判断的规则(利用兼容以前的代码),es6给出了Object.is API。
Object.is 用于判断两个数据是否相等,基本上跟严格相等(===)是一致的,除了NaN的判断和+0、-0的判断。
console.log(Object.is(NaN, NaN)); //true
console.log(Object.is(+0, -0)); //false
- Object.assign 用于混合属性
需求: obj1和obj2混合,obj2里的属性和obj1里属性名相同的覆盖obj1的,属性名不相同的各自都作为一个属性保留从而得到一个新的对象obj
const obj1 = {
a: 123,
b: 456,
c: "abc"
}
const obj2 = {
a: 789,
d: "kkk"
}
const obj = Object.assign(obj1, obj2);
console.log(obj);
console.log(obj===obj1);//true
这里将obj2的数据,覆盖obj1,并且会对obj1产生改动,然后返回obj1
obj1被改动,obj2不变
为了弥补这一缺陷,这个混合可以写做
const obj = Object.assign({}, obj1, obj2);
console.log(obj)
console.log(obj === obj1)
console.log(obj1)
console.log(obj2)
这样改动的是{},不会影响到obj1和obj2
es7时还有一种简便的写法混合两个对象:
const obj = {
...obj1,
...obj2
} //这是es7里的方法 这个方法还不会改动obj1
console.log(obj);
- Object.getOwnPropertyNames的枚举顺序 此方法之前就存在,只不过,官方没有明确要求如何排列属性的顺序,如何排序由浏览器厂商决定。
ES6规定了该方法返回的数组的排序方式 先排数字,并按照升序排序;再排其他,按照书写顺序排序
const obj5 = {
d: 1,
b: 2,
a: 3,
0: 6,
5: 2,
4: 1
}
const props5 = Object.getOwnPropertyNames(obj5);
console.log(props5); //
- Object.setPrototypeOf 该函数用于设置某个对象的隐式原型
比如Object.setPrototypeOf(obj1, obj2)
相当于bj1._proto_ = obj2
它是ES6正式推荐的设置原型对象的方法。
const obj6 = {
a: 1
}
const obj7 = {
b: 2
}
// obj6._proto_ = obj7
Object.setPrototypeOf(obj6, obj7);
console.log(obj6); // obj6._proto_
注意:该操作实际上是个很耗时的操作,如果对性能有更高的要求,不建议直接修改已有对象的原型,而应该通过Object.create()方法来创建一个新的对象。
示例:修改对象的原型对象
var obj1 = { a: 1 };
// obj2的原型是obj1
var obj2 = Object.create(obj1);
Object.getPrototypeOf(obj2) === obj1; // true
obj2.a; // 1
var obj3 = { b: 2 };
// 修改obj2的原型为obj3
Object.setPrototypeOf(obj2, obj3);
Object.getPrototypeOf(obj2) === obj3; // true
obj2.a; // undefined
obj2.b; // 2