Js使用Object.assign()对象的复制、合并、封装等操作

更新日期: 2018-01-02阅读: 8.3k标签: 复制

OObject.assign()方法可将所有可枚举属性的值从一个或多个源对象复制到目标对象,它将返回目标对象。 其中对象的继承属性和不可枚举属性是不能拷贝的。


对象的复制

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

说明:assign复制的是属性值,不能复制源对象中具有引用其它对象的属性值,所以不能使用它来实现深拷贝。实现深拷贝请参考:js中深拷贝和浅拷贝的区别及原理

在官方文档中写得一个Polyfill ,代码加了点注释如下:

if (!Object.assign) {
    // 定义assign方法
  Object.defineProperty(Object, 'assign', {
    enumerable: false,
    configurable: true,
    writable: true,
    value: function(target) { // assign方法的第一个参数
      'use strict';
      // 第一个参数为空,则抛错
      if (target === undefined || target === null) {
        throw new TypeError('Cannot convert first argument to object');
      }

      var to = Object(target);
      // 遍历剩余所有参数
      for (var i = 1; i < arguments.length; i++) {
        var nextSource = arguments[i];
        // 参数为空,则跳过,继续下一个
        if (nextSource === undefined || nextSource === null) {
          continue;
        }
        nextSource = Object(nextSource);

        // 获取改参数的所有key值,并遍历
        var keysArray = Object.keys(nextSource);
        for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {
          var nextKey = keysArray[nextIndex];
          var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
          // 如果不为空且可枚举,则直接浅拷贝赋值
          if (desc !== undefined && desc.enumerable) {
            to[nextKey] = nextSource[nextKey];
          }
        }
      }
      return to;
    }
  });
}

从上面代码可以看出Object.assign()只对顶层属性做了赋值,没有继续做递归把所有下一层的属性做深拷贝。


对象的合并和封装

var obj1 = { a: 1,};
var obj2 = { b: 2, c: 2 };
var obj3 = { c: 3 };
var obj = Object.assign({}, obj1, obj2, obj3,null,undefined,"abc",{[Symbol("sbl")]:4});
console.log(obj); //输出{0: "a", 1: "b", 2: "c", a: 1, b: 2, c: 3}
VM1253:5 {0: "a", 1: "b", 2: "c", a: 1, b: 2, c: 3, Symbol(sbl): 4}

说明:1.对象的属性被后续参数中具有相同属性的其他对象覆盖;2.null、undefined会被忽略;3.字符串会被封装成单字符的可枚举属性数组。


链接: https://www.fly63.com/article/detial/299

原生Js实现复制(Copy)的方法总结,execCommand和clipboardData的使用

原生Js实现复制(Copy)的两种方法,一种是利用 clipboardData,另外一种则是用 execCommand(),今天将统一讲解一下关于他们的使用方法。

网页不让用户复制方法总汇,设置html禁止选择,保护源码,js禁止复制文字

这篇文章主要讲解:右键复制失效方法、菜单-文件-另存为-失效方法、防止查看源代码进行复制的方法、防止页面缓存的方法。来达到一定的代码保护效果

程序员_代码神注释鉴赏大全(可复制粘贴)

程序员个性注释,让你的代码飞起来。一时兴起就收集了以下神注释,希望能为广大ITer带来快乐,以下是收集了以下神注释,希望能为广大程序员们带来快乐,缓解你们工作中的压力

Vue中结合clipboard实现复制功能

首先现在Vue中引入clipboard,在需要使用的组件中import 引入clipboard.不论是单按钮复制还是多按钮复制,一定要在页面加载DOM完成后先New出来具有复制功能的按钮,如果在函数内再New那么可能会出现点击复制按钮两次,才复制成功的现象

最全的js对象克隆和数组克隆方法

工作中我们需要用到对象或者数组的复制功能,提交的form表单,需要进行处理,例如将表单中的数组变成,连接的字符串,这个时候我们直接对原表单直接处理是不妥当的

原生js实现复制内容到剪切板,兼容pc、移动端(支持Safari浏览器)

在开发中经常会遇到这样的需求,第一种就是点击复制当前页面的链接,第二种就是类似卡券的功能,需要复制密码等等。纯js实现复制文本并提示复制成功(干货)适用所有浏览器

原生JS在网页上复制的所有文字后面自动加上一段版权声明

不少技术博客有这样的处理,当我们复制代码的时候,会自动加上一段本信息版权为XXXX,这是怎么实现的呢?其实实现的方式很简单,可以在我的网站页面上绑定一个 copy 事件,当你复制文章内容的时候

如何设置网页无法复制?

javascript设置网页无法复制的方法:在JavaScript代码中设置禁用右键菜单、复制、选择等操作,禁用Ctrl+c和Ctrl+v快捷键的使用,通过这种方法就可以实现网页无法复制。

HTML页面 用CSS实现禁止选中、复制和右键

最近在写页面的时候,需要在左上角加一个logo,但是复制的时候会把这张图片一块选中。那么我们可以通过CSS给它设置禁止选中,代码如下:

css如何设置不可复制?

css可以使用user-select属性来设置不可复制,此属性可以设置或检索是否允许用户选中文本,将此属性的属性值设置为none可以使文本不可选中。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!