为什么 Object.assign 添加到原型的构造函数中?

Why does Object.assign add to the prototype's constructor?

我正在 Javascript 中学习组合,并且想知道为什么我的代码中的 Object.assign() 将方法添加到原型的构造函数而不是对象的构造函数。我将 link 下面的代码。基本上,代码是通过使用 Object.assign() 向 Person 对象添加两个方法(吃和走)。但是,如下图所示,控制台显示的方法属于 Person.prototype 的构造函数,而不是 Person 对象本身。我一定是想多了。任何帮助表示赞赏。谢谢!



代码

const canEat = {
    eat() {
        this.hunger--;
        console.log('eating');
    }
};

const canWalk = {
    walk: function() {
        console.log('walking');
    }
};

const canSwim = {
    swim: function() {
        console.log("swim");
    }
};

function Person() {

}

Object.assign(Person,canEat,canWalk);
const person = new Person();
console.log(person);

您没有检查 Person 对象。如果您不熟悉 console.log 输出,这看起来有点像您,因为第一行说 Person,但您记录的是 Person 的实例,而不是 Person本身。

您正在记录的实例的原型是 Person.prototypePerson.prototype 对象有一个 constructor 属性 引用 Person 函数.当您看到 eatwalk 列为 constructor 下的属性时,这意味着它们是 Person 函数的属性,因为它们应该是。

Object.assign求值时:

Object.assign(Person, canEat, canWalk);

eatwalk 属性分配给 Person 函数。

创建 Person 的实例时:

const person = new Person();

然后我们有一个新对象,它有一个 constructor 属性 指向 Person 函数。但是,新对象既没有 eat 也没有 walk 属性(属于 Person [constructor] 函数)。

如果您想让 eatwalk 属性可用于 Person 的实例,您应该将这些方法分配给 Person.prototype

Object.assign(Person.prototype, canEat, canWalk);

因为用new运算符创建对象时,它不是继承构造函数Person,而是继承构造函数原型Person.prototype.