为什么 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.prototype
,Person.prototype
对象有一个 constructor
属性 引用 Person
函数.当您看到 eat
和 walk
列为 constructor
下的属性时,这意味着它们是 Person
函数的属性,因为它们应该是。
当Object.assign
求值时:
Object.assign(Person, canEat, canWalk);
eat
和 walk
属性分配给 Person
函数。
创建 Person
的实例时:
const person = new Person();
然后我们有一个新对象,它有一个 constructor 属性 指向 Person
函数。但是,新对象既没有 eat
也没有 walk
属性(属于 Person
[constructor] 函数)。
如果您想让 eat
和 walk
属性可用于 Person
的实例,您应该将这些方法分配给 Person.prototype
:
Object.assign(Person.prototype, canEat, canWalk);
因为用new运算符创建对象时,它不是继承构造函数Person
,而是继承构造函数原型Person.prototype
.
我正在 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.prototype
,Person.prototype
对象有一个 constructor
属性 引用 Person
函数.当您看到 eat
和 walk
列为 constructor
下的属性时,这意味着它们是 Person
函数的属性,因为它们应该是。
当Object.assign
求值时:
Object.assign(Person, canEat, canWalk);
eat
和 walk
属性分配给 Person
函数。
创建 Person
的实例时:
const person = new Person();
然后我们有一个新对象,它有一个 constructor 属性 指向 Person
函数。但是,新对象既没有 eat
也没有 walk
属性(属于 Person
[constructor] 函数)。
如果您想让 eat
和 walk
属性可用于 Person
的实例,您应该将这些方法分配给 Person.prototype
:
Object.assign(Person.prototype, canEat, canWalk);
因为用new运算符创建对象时,它不是继承构造函数Person
,而是继承构造函数原型Person.prototype
.