zoukankan      html  css  js  c++  java
  • Object.create 和 Object.assign

    Object.assign(target, ...source)

    1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set,所以会调用相关getter和setter。

    通俗点说:源对象的属性值需要配置可枚举,enumerable为true,目标对象的属性值需要可写,writable为true才可以进行拷贝。如果目标对象不可写入,则会TypeError

    String类型和 Symbol 类型的属性都会被拷贝。mdn地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()Object.defineProperty() 。使用这两个方法,可以拷贝属性描述器

    // 说明源对象的属性需要是可枚举的
    const target = { a: 1, b: 2 } const source = { a: 2 } Object.defineProperty(source, 'b', { // 不可枚举 value: 3 }) Object.assign(target, source) console.log(target)// {a: 2, b: 3}
    // 说明目标对象的属性,需要是可写入的
    const target = { a: 1 } const source = { a: 2, b: 3 } Object.defineProperty(target, 'b', { // 不可写 value: 2 }) Object.assign(target,source) // TypeError: Cannot assign to read only property 'b' of object '#<Object> console.log(target)
    // 说明原型上的属性,不会进行拷贝
    const target = { a: 1 } function Test () { this.a = 2, this.b = 3 } Test.prototype.c = 2 const source = new Test() Object.assign(target,source) console.log(source) console.log(target)

    Object.create(proto, propertiesObject)

    var obj = Object.create({
      _a: 3
    }, {
      a: {
        value: 4,
        enumerable: true,
        writable: true,
        configurable: true
      }
    })
    console.log(obj)

    第一个参数为原型对象 obj.__proto__ = proto

    第二个参数为对象自身的属性:属性描述器

  • 相关阅读:
    springboot+mybatisplus使用xml找不到mapper的解决办法
    PDF转换成Word文档
    Mybatis-Plus增删改查
    Redis 常用命令
    Java 获取两个List<String>中不同的数据
    controller 返回界面 中文乱码
    Navicat已经成功连接,密码忘记的解决方案
    List数组指定切割
    xml字符串转换成Map
    Java 前一个月的最后一天日期计算
  • 原文地址:https://www.cnblogs.com/yaxinwang/p/14278231.html
Copyright © 2011-2022 走看看