object.assign

440 阅读3分钟

object.assign

百度上对这个解释

Object.assign() 方法将所有可枚举( 返回 true)的自有( 返回 true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。

这样子的解释我第一眼看的时候是比较懵逼的什么讲可枚举的自有属性从一个或多个源对象复制到目标对象呢

接下来我就看了例子

 const a = {a : "我现在是a里的a" , b : "我现在是b里的b"}
 const b = {a : "我现在是b里的a" , b : "我现在是b里的a"}
  const ab = Object.assign(a,b)
  console.log(ab)// {a: "我现在是b里的a",b: "我现在是b里的a",c: "我现在是b里面的c"[[Prototype]]: Object
  console.log(a) // {a: "我现在是b里的a",b: "我现在是b里的a",c: "我现在是b里面的c"[[Prototype]]: Object

这样子看下去其实吧这个api的方法就是将两个对象合起来罢了

但是我对这个例子的第一反映 打印a应该还是const a 的值

可是并不是这个拼接后的值然后我又看了下面

如果目标对象与源对象具有相同的 key,则目标对象中的属性将被源对象中的属性覆盖,后面的源对象的属性将类似地覆盖前面的源对象的属性
是这样子描述的但是我有想了跟深拷贝还有浅拷贝的关系呢
​
如果目标对象与源对象具有相同的 key,则目标对象中的属性将被源对象中的属性覆盖,后面的源对象的属性将类似地覆盖前面的源对象的属性

这样的描述对我来说还是不可以接受的因为我并没有理解最后的意思

因为下面有这样的一个描述

Object.assign 方法只会拷贝源对象 可枚举的 和 自身的 属性到目标对象。该方法使用源对象的 和目标对象的 ,它会调用 getters 和 setters。故它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含 getters,这可能使其不适合将新属性合并到原型中。[[Get]][[Set]]

这个getters跟setters是 什么呢感觉特别眼熟的东西

getters跟setters

这个东西比较简单我就没有写例子了

直接拿的是网上的例子

首先是get 很明显可以看到get是可以直接拿到这个对象里面的所有的键值对的

let user = {
  name: "John",
  surname: "Smith",
 
  get fullName() {
    return `${this.name} ${this.surname}`;
  }
};
 
alert(user.fullName); // John Smith

再是set 这里可以看出来在set 的时候可以改变这个对象的键值对的值的在对象外部时候直接等于

let user = {
  name: "John",
  surname: "Smith",
 
  get fullName() {
    return `${this.name} ${this.surname}`;
  },
 
  set fullName(value) {
    [this.name, this.surname] = value.split(" ");
  }
};
 
// set fullName is executed with the given value.
user.fullName = "Alice Cooper";
 
alert(user.name); // Alice
alert(user.surname); // Cooper

既然这样的话那我使用object.assign的话我的getter 或 set 是不是也可以一样复制过去呢

const a = {
        a: "我现在是a里的a", b: "我现在是b里的b",
        get setfunction() {
            return `${this.a} ${this.b}`;
        },
        set setfunction(value) {
            [this.a, this.b] = value.split(" ");
        }
    }
​
    const b = { a: "我现在是b里的a", b: "我现在是b里的a", c: "我现在是b里面的c" }
    const ab = Object.assign(a, b)
    ab.setfunction = "我是set的a 我是set的b"
    console.log(ab)
​
    console.log(a)

很明显是可以的这个get属性跟set属性是可以继承的那么到底什么属性继承不了呢

原型链上的属性和不可枚举属性不能被复制

  const obj = Object.create({ foo: 1 }, { // foo is on obj's prototype chain.
        bar: {
            value: 2
        },
        baz: {
            value: 3,
            enumerable: true
        }
    });
    console.log(obj) // {baz: 3, bar: 2}
    const copy = Object.assign({}, obj);
    console.log(copy); // { baz: 3 }

\