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

时间:2019-07-20 06:32:03

标签: javascript oop object-composition

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

enter image description here


enter image description here


代码

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);

2 个答案:

答案 0 :(得分:2)

评估Object.assign时:

Object.assign(Person, canEat, canWalk);

eatwalk属性已分配给Person函数。

创建Person的实例时:

const person = new Person();

这时,我们有了一个新对象,该对象具有指向Person函数的constructor属性。但是,新对象既没有eat也没有walk属性(这些属性属于Person [constructor]函数)。

如果您想为eat的实例提供walkPerson属性,则应将这些方法分配给Person.prototype

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

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

答案 1 :(得分:1)

您没有检查Person对象。如果您不熟悉console.log的输出,则看起来就像您,因为第一行显示Person,但是您记录的是Person而不是{{ 1}}本身。

您要记录的实例的原型为Person,并且Person.prototype对象具有一个引用Person.prototype函数的constructor属性。当您看到Personeat被列为walk下的属性时,这意味着它们实际上是constructor函数的属性。