javascript - 为什么 Object.assign 添加到原型(prototype)的构造函数中?

标签 javascript oop object-composition

我正在学习 Javascript 中的组合,并且想知道为什么我的代码中的 Object.assign() 向原型(prototype)的构造函数而不是对象的构造函数添加方法。我将链接下面的代码。基本上,代码是使用 Object.assign() 将两个方法(吃饭和行走)添加到 Person 对象。但是,如下图所示,控制台将方法显示为属于 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);

最佳答案

Object.assign被评估时:

Object.assign(Person, canEat, canWalk);

eatwalk 属性分配给 Person 函数。

创建Person实例时:

const person = new Person();

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

如果您想让 eatwalk 属性可用于 Person 的实例,则应将这些方法分配给 Person。原型(prototype)改为:

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

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

关于javascript - 为什么 Object.assign 添加到原型(prototype)的构造函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57122354/

相关文章:

javascript - 使用 jquery ui 拖放工具

objective-c - 从父类(super class)到达子类的成员

oracle - 是否可以在 PL/SQL 中使用对象组合?

java - 通过 getter 方法改变对象的状态通常被认为是一种不好的做法吗?

javascript - JavaScript 变量的范围?

javascript - execCommand 向我的元素添加不需要的样式

java - 只能从数组中索引 0 处删除对象

python - 如何使python类支持项目分配?

javascript - 如何在 DIV 标签中设置目标 ="_blank"?

c++ - 类 'Entity' 中类 'Component' 的指针变量,即使包含 'Entity.h' 也会出错