0

我正在学习 Javascript 中的组合,并且想知道为什么我的代码中的 Object.assign() 将方法添加到原型的构造函数而不是对象的构造函数。我将链接下面的代码。基本上,代码是使用 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);

4

2 回答 2

2

何时Object.assign评估:

Object.assign(Person, canEat, canWalk);

eat并将walk属性分配给Person功能。

创建实例时Person

const person = new Person();

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

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

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

因为当一个对象用new操作符创建时,它不是继承自构造函数Person,而是继承自构造函数原型Person.prototype

于 2019-07-20T06:45:26.870 回答
1

你不是在检查Person对象。如果您不熟悉console.log输出,看起来就像您一样,因为第一行说的Person是 ,但您正在记录 的实例Person,而不是Person它本身。

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

于 2019-07-20T06:40:58.030 回答