美文网首页
ES6对象用法

ES6对象用法

作者: nomooo | 来源:发表于2018-12-22 15:12 被阅读0次

属性的简洁表示法

ES6允许直接写入变量和函数,作为对象的属性和方法。

    const foo = 'bar';
    const baz = { foo };
    console.log(baz); // {foo: "bar"}

ES6允许在对象之中直接写变量,这时,属性名为变量名,属性值为变量值

属性简写

    function f(x, y) {
        return { x, y }
    };
    console.log(f(2, 3)); //{x: 2, y: 3}

方法简写

    const o = {
        method() {
            return 'Mr'
        }
    }
    console.log(o.method()); //Mr

举个🌰

    let birth = '2001/01/01';

    const Person = {
        name: 'Mr Zhang',
        //等同于 birth:birth
        birth,
        //等同于hello:function(){}
        hello() {
            console.log('My name is' + this.name)
        }
    }

ES6 允许字面量定义对象时,用表达式作为对象的属性名,即把表达式放在方括号内。

    let lastName = 'lastName'

    const obj = {
        'first Name': 'Mr',
        [lastName]: 'Wang'
    }

    console.log(obj.lastName); // Wang
    console.log(obj["first Name"]); // Mr
    console.log(obj[lastName]); //Wang

表达式还可以用于定义方法名。

    let obj2 = {
        ['h' + 'ello']() {
            return 'Hi'
        }
    }

    console.log(obj2.hello()); //Hi

super关键字

this关键字总是指向函数所在的当前对象,ES6又增加了一个类似的关键字super,指向当前对象的原型对象

    const proto = {
        foo: 'hello'
    }
    const obj = {
        foo: 'Mr',
        find() {
            return super.foo;
        }
    }
    Object.setPrototypeOf(obj, proto);
    console.log(obj.foo);// Mr

上面代码中,对象obj.find()方法中,通过super.foo引入了原型对象proto的foo属性
需要注意的是,super关键字表示原型对象时,只能用在对象的方法中,用在其他地方会报错

JavaScript引擎内部,super.foo等同于Object.getPrototypeOf(this).foo或Object.getPrototypeOf(this).foo.call(this)

    const proto = {
        x: 'Hello',
        foo() {
            console.log(this.x)
        }
    }
    const obj = {
        x: 'world',
        foo() {
            //super.foo指向原型对象的proto的foo方法,但绑定的this却还是当前对象obj
            super.foo();
        }
    }

    Object.setPrototypeOf(obj, proto);
    //所以输出是world
    obj.foo(); // world

对象的解构赋值

对象的解构赋值用于从一个对象取值,相当于将目标对象自身的所有可遍历的,但尚未被读取的属性,分配到指定的对象上面。

    let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
    console.log(x); // 1
    console.log(y); // 2
    console.log(z); // {a: 3, b: 4}

解构赋值的拷贝是浅拷贝,即如果一个键的值是复合类型的值(函数,对象,数组),那么解构赋值拷贝的这个是的引用,而不是副本。

    let obj = { a: { b: 1 } }
    let {...x } = obj;
    obj.a.b = 2;
    console.log(x.a.b); // 2

注意:ES6中规定,变量声明语句之中,如果使用解构赋值,拓展运算符后面必须是一个遍历名,而不能是一个解构赋值表达式。

拓展运算符

对象的拓展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之后

    let z = { a: 3, b: 4 };
    let n = {...z };
    console.log(n);//{a: 3, b: 4}

数组是特殊的对象,所以对象的拓展运算符也可以用于数组

    let foo = {...['a', 'b', '3'] };
    console.log(foo);//{0: "a", 1: "b", 2: "3"}

上面的例子都是拷贝了对象实例的属性,如果想克隆一个对象,还拷贝对象原型的属性,可以采用下面写法

    //写法1
    const clone1 = {
        _proto_: Object.getPrototypeOf(obj),
        ...obj
    }

    //写法2
    const clone2 = Object.assign(
        Object.create(Object.getPrototypeOf(obj)),
        obj
    )

    //写法3
    const clone3 = Object.create(
        Object.getPrototypeOf(obj),
        Object.getOwnPropertyDescriptor(obj)
    )

还以可用来合并两个对象

    let a = { A: "A" };
    let b = { B: "B" };
    let ab = {...a, ...b };
    console.log(ab); // {A: "A", B: "B"}

如果自定义的属性,放到拓展运算符的后面,则拓展运算符内部的同名属性会被覆盖

    let a = { a: 'a', b: 'b' }
    let na = {...a, b: '1' };
    console.log(na);//{a: "a", b: "1"}

如果放到前面,就是新对象的默认属性值

    let a = { a: 'a', b: 'b' }
    let na = { b: '1', c: 'c', ...a };
    console.log(na); //{b: "b", c: "c", a: "a"}

相关文章

  • let 和 const 命令

    let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...

  • let 和 const 命令

    let 命令 块级作用域 const 命令 顶层对象的属性 global 对象 let 命令 基本用法 ES6 新...

  • let 和 const 命令

    let 命令 块级作用域 const 命令 顶层对象的属性 globalThis 对象 基本用法 ES6 新增了l...

  • ES6 Object.assign()的用法

    ES6的Object.assign()的基本用法 Object.assign方法用于对象的合并,将源对象(sour...

  • es6 class类的用法

    es6 class基础用法 以前的JavaScript没有类的概念,它是基于原型的面相对象的语言。原型对象的特点就...

  • 2019-01-15 Javascript Proxy

    proxy是es6里面标准化构造对象拦截器的类使用方法 基本用法 操作转发

  • 解构赋值

    1、数组的解构赋值 定义:ES6允许按照一定模式,从数组和对象中提取值,对对象进行赋值,被称为解构赋值。 基本用法...

  • 3变量的解构赋值

    数组、对象、字符串、数值、布尔值、函数参数 数组的解构赋值 基本用法ES6 允许按照一定模式,从数组和对象中提取值...

  • 面向对象 解决增删改查

    面向对象 1. 用构造函数方法 构造函数类似于类,但不是类,在ES6出来之前常规用法。 1. 用类方法 ES6出来...

  • ES6入门基础

    ES6入门基础 一.let & const 1.基本用法 es6新增 let命令,用来申明变量,用法类似于var,...

网友评论

      本文标题:ES6对象用法

      本文链接:https://www.haomeiwen.com/subject/djepkqtx.html