我正在学习Javascript的编写,并且想知道为什么我的代码中的Object.assign()向原型的构造函数而不是对象的构造函数添加方法。我将链接下面的代码。基本上,代码使用Object.assign()向Person对象添加了两种方法(eat和walk)。但是,如下图所示,控制台将方法显示为属于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);
答案 0 :(得分:2)
评估Object.assign
时:
Object.assign(Person, canEat, canWalk);
eat
和walk
属性已分配给Person
函数。
创建Person
的实例时:
const person = new Person();
这时,我们有了一个新对象,该对象具有指向Person
函数的constructor属性。但是,新对象既没有eat
也没有walk
属性(这些属性属于Person
[constructor]函数)。
如果您想为eat
的实例提供walk
和Person
属性,则应将这些方法分配给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
属性。当您看到Person
和eat
被列为walk
下的属性时,这意味着它们实际上是constructor
函数的属性。