es6-对象新增的字面量语法及新增的API

本文介绍了ES6中对象字面量的新语法,包括成员速写、方法速写和计算属性名。同时讲解了ES6中Object新增的API,如Object.is、Object.assign、Object.getOwnPropertyNames的枚举顺序以及Object.setPrototypeOf,详细阐述了它们的用途和用法,以及在实际应用中的注意事项。
摘要由CSDN通过智能技术生成

新增的对象字面量语法

  1. 成员速写
    对于如下这个情形的对象,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();
  1. 方法速写 对象字面量初始化时,方法可以省略冒号和function关键字
const user = {
    name: "钟南山",
    age: "100",
    // sayHello:function(){
    //     console.log(this.name,this.age);
    // }
    sayHello() {
        console.log(this.name, this.age);
    } //等效于上面写法,只是一个语法糖,写起来更加轻松一些,本质是没有区别
}
user.sayHello();
  1. 计算属性名 初始化对象时,某些属性名可能来自于某个表达式的值,在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等
对象也是构造函数,这些都是静态方法,直接附着在函数上的方法

  1. 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
  1. 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);
  1. 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); //

在这里插入图片描述

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值