banner
banner
banner
NEWS LETTER

ES6-对象的拓展

Scroll down

属性名表达式

  • 方法一:用标识符作为属性名
    • obj.foo = true
  • 方法二:用表达式作为属性名
    • obj[‘a’ + ‘bc’] = 123
  • 注意:属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 对象字面量
    let obj = {
    ['a' + 'bc']: 123
    }
    // 定义方法名
    let obj = {
    ['h' + 'ello'](){
    return 'hi'
    }
    }
    obj.hello()

函数的name属性,返回函数名。对象方法也是函数

1
2
3
4
5
6
7
8
const person = {
sayName() {
console.log('hello')
},
get foo() {},
set foo(x) {}
}
person.sayNAme.name // 'sayName'
  • 如果对象的方法使用了取值函数(getter)和存值函数(setter),则name再该方法的属性的get和set上
    1
    2
    3
    const desc = Object.getOwnProertyDescriptor(person,'foo')
    desc.get.name "get foo"
    desc.set.name "set foo"
  • 特殊情况:
    • 1、bind方法创造的函数,name属性返回bound 加上原函数名;Function构造函数创造的函数,返回anonymous
      1
      2
      3
      (new Function()).name // "anonymous"
      var doSomething = function() {}
      doSomething.bind().name //"bound doSOmething"
    • 2、对象方法是一个Symbol值
      1
      2
      3
      4
      5
      const key1 = Symbol('description')
      let obj = {
      [key1]() {}
      }
      obj[key1].name // 'description'

属性的遍历

for…in

  • for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

Object.keys(obj)

  • Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

Object.getOwnPropertyNames(obj)

  • Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

Object.getOwnPropertySymbols(obj)

  • Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。

Reflect.ownKeys(obj)

  • Reflect.ownKeys返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

遍历顺序

  • 首先遍历所有数值键,按照数值升序排列。
  • 其次遍历所有字符串键,按照加入时间升序排列。
  • 最后遍历所有 Symbol 键,按照加入时间升序排列。
  • Reflect.ownKeys({ [Symbol()]:0, b:0, 10:0, 2:0, a:0 }) // [‘2’, ‘10’, ‘b’, ‘a’, Symbol()]

super 指向当前对象的原型对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const proto = {
x: 'hello',
foo() {
console.log(this.x);
},
};

const obj = {
x: 'world',
foo() {
super.foo();
}
}

//将proto设置为obj的原型
Object.setPrototypeOf(obj, proto);
obj.foo()

扩展运算符…

1
2
3
4
5
let z = { a: 3, b: 4 }
let n = { ...z }

let foo = { ...['a','b','c']}
foo // {0:"a",1:"b",z:"c"}
  • 对象的扩展运算符等同于使用Object.assign()方法。

对象的新增方法

Object.is(值1,值2), 判断两个值是否严格相等(===)

  • +0不等于-0,NAN等于自身

Object.assign()方法用于对象的合并(浅拷贝)

  • 多参:
    • Object.assign(复制存放地, 被复制对象, 被复制对象,…);
  • 一参:返回该参数
    • undefined,null做首参则报错
    • 参数非对象,转对象在返回
    • 不拷贝enumerable: false

注意

  1. 浅拷贝:只要修改其中一个,其它的也会改变
    1
    2
    3
    4
    5
    6
    7
    8
    const obj1 = {a: {b:1}};
    const obj2 = Object.assign({},obj1);

    obj1.a.b = 2;
    console.log(obj2.a.b)

    obj2.a.b = 4;
    console.log(obj1.a.b)
  2. 同名属性替换(复制存放的对象属性如果跟被复制的对象属性一样,替换)
  3. 可以处理数组,但是会把数组视为对象

常见用途

  1. 为对象添加属性
    1
    2
    3
    4
    5
    6
    //将x属性和y属性添加到Point类的对象实例
    class Point {
    constructor(x, y) {
    Object.assign(this, {x, y});
    }
    }
  2. 为对象添加 方法
    1
    2
    3
    4
    5
    6
    7
    //给SomeClass.prototype添加方法
    Object.assign(SomeClass.prototype, {
    someMethod(arg1, arg2) {
    },
    anotherMethod() {
    }
    });
  3. 克隆对象
    1
    2
    3
    4
    function clone(origin) {
    let originProto = Object.getPrototypeOf(origin);
    return Object.assign(Object.create(originProto), origin);
    }
  4. 合并多个对象
    1
    const merge = (target, ...sources) => Object.assign(target, ...sources);
其他文章
cover
ES6-函数的拓展
  • 24/10/31
  • 15:54
  • ES6
cover
ES6-编程风格
  • 24/10/31
  • 15:54
  • ES6
目录导航 置顶
  1. 1. 属性名表达式
  2. 2. 函数的name属性,返回函数名。对象方法也是函数
  3. 3. 属性的遍历
    1. 3.1. for…in
    2. 3.2. Object.keys(obj)
    3. 3.3. Object.getOwnPropertyNames(obj)
    4. 3.4. Object.getOwnPropertySymbols(obj)
    5. 3.5. Reflect.ownKeys(obj)
    6. 3.6. 遍历顺序
  4. 4. super 指向当前对象的原型对象
  5. 5. 扩展运算符…
  6. 6. 对象的新增方法
    1. 6.1. Object.is(值1,值2), 判断两个值是否严格相等(===)
    2. 6.2. Object.assign()方法用于对象的合并(浅拷贝)
    3. 6.3. 注意
    4. 6.4. 常见用途
请输入关键词进行搜索