zoukankan      html  css  js  c++  java
  • Object 对象方法学习之(1)—— 使用 Object.assign 复制对象、合并对象

    作用

    Object.assign() 方法用于把一个或多个源对象的可枚举属性值复制到目标对象中,返回值为目标对象。

    语法

    Object.assign(target, ...sources)
    

    参数

    target: 目标对象
    sources: 源对象

    返回值

    目标对象

    描述

    Object.assign 方法只复制源对象中可枚举的属性和对象自身的属性。它在源对象上使用 [[Get]], 在目标对象上使用 [[Set]], 会调用 gettersetter。它不适合用于把一个包含 getter 的对象属性合并到一个原型中。如果要把属性定义连同可枚举性复制到一个原型中,应该使用 Object.getOwnPropertyDescriptor()Object.defineProperty() 方法。

    StringSymbol 类型的属性都会被复制。

    当发生错误时,例如有一个属性是不可写的,将会抛出一个 TypeError 错误,目标对象保持不变。

    注意 *Object.assign() * 源对象为 nullundefined 时不会报错。

    示例

    克隆对象

    var obj = {a: 1};
    var copy = Object.assign({}, obj);
    console.log(copy); // {a: 1};
    

    合并对象

    var o1 = {a: 1};
    var o2 = {b: 2};
    var o3 = {c: 3};
    
    var obj = Object.assign(o1, o2, o3);
    console.log(obj); //{a: 1, b: 2, c: 3}
    console.log(o1); //{a: 1, b: 2, c: 3}, 目标对象被改变了
    

    原型链上的属性和不可枚举的属性无法复制

    var obj = Object.create({foo: 1}, { // foo 在 obj 的原型链上
      bar: {
                value: 2  // bar 是一个不可枚举的属性.
          },
      baz: {
                 value: 3,
                 enumerable: true  // baz 是 obj 自身的一个可枚举属性
          }
      });
    
    var copy = Object.assign({}, obj);
    console.log(copy); // { baz: 3 },原型链上的属性和不可枚举的属性没有复制到
    

    传递原始类型

    var v1 = 'abc';
    var v2 = true;
    var v3 = 10;
    var v4 = Symbol('foo');
    
    var obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
    //注意只有字符串类型的值有可枚举属性
    console.log(obj); // { "0": "a", "1": "b", "2": "c" }
    

    异常会中断正在执行的复制任务

    var target = Object.defineProperty({}, 'foo', {
      value: 1,
      writable: false
    }); // target.foo 是一个只读属性
    
    Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
    // TypeError: "foo" is read-only
    // 在分配 target.foo 时该异常被抛出
    
    console.log(target.bar);  // 2, 第一个源对象复制成功
    console.log(target.foo2); // 3, 第二个源对象的第一个属性复制成功
    console.log(target.foo);  // 1, 异常在这里抛出
    console.log(target.foo3); // undefined, 任务已经结束, foo3 不会被复制 assign
    console.log(target.baz);  // undefined, 第三个源对象也不会被复制
    

    有访问器的情况

    var obj = {
      foo: 1,
      get bar() {
        return 2;
      }
    };
    
    var copy = Object.assign({}, obj); 
    console.log(copy); 
    // { foo: 1, bar: 2 }, copy.bar 的值是 bar 的 getter 的返回值
    

    ES5版本实现方法

    if (typeof Object.assign != 'function') {
      Object.assign = function(target) {
        'use strict';
        if (target == null) {
          throw new TypeError('Cannot convert undefined or null to object');
        }
    
        target = Object(target);
        for (var index = 1; index < arguments.length; index++) {
          var source = arguments[index];
          if (source != null) {
            for (var key in source) {
              if (Object.prototype.hasOwnProperty.call(source, key)) {
                target[key] = source[key];
              }
            }
          }
        }
        return target;
      };
    }
    
  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/heiye168/p/5689006.html
Copyright © 2011-2022 走看看