gpt4 book ai didi

javascript - 与散布对象的组合

转载 作者:行者123 更新时间:2023-12-04 10:39:19 26 4
gpt4 key购买 nike

我看了一个关于组合的教程,它让你像这样组合对象:

const eater = (state) => ({
eat(amount) {
console.log(state.name + ' is eating');
state.energy += amount;
}
});

// using a factory
const Dog = (name, energy, breed) => {
let dog = {
name,
energy,
breed
};
return Object.assign(dog, eater(dog));
};

const leo = Dog('Leo', 10, 'Pug');
leo.eat(10); // Leo is eating
console.log(leo.energy); // 20


我想知道您是否可以这样做,以及这样做是否有任何缺点:

const eater = {
eat(amount) {
console.log(this.name + ' is eating');
this.energy += amount;
}
};

const Dog = (name, energy, breed) => {
let dog = {
name,
energy,
breed,
...eater
};
return dog;
};

const leo = Dog('Leo', 10, 'Pug');
leo.eat(10); // Leo is eating
console.log(leo.energy); // 20


如您所见,使用 Object.assign 而不是创建函数并将其分配给对象,我创建另一个对象 eater用一种方法,然后我传播它 eater对象并将其添加到 dog在工厂内部创建的对象。

那么,这样做有什么问题吗?

谢谢!

最佳答案

这两种方法非常相似。两者都是可行的好方法。

以下是不同之处:

  • 第一种方法:eater是工厂函数
  • eater对象和 eat为每个 dog 创建函数
  • eat方法绑定(bind):
    let leoEat = leo.eat;
    leoEat(10); //works
  • 第二种方法:eater是一个对象
  • eater对象和 eat函数被重用
  • eat不受约束:
    const leo = Dog('Leo', 10, 'Pug');
    const animal = {name: 'Animal', energy: 0};
    leo.eat.call(animal, 30); // Animal is eating
    console.log(animal.energy); // 30
    console.log(leo.energy); // 10
  • 第三种方法(是的,有!):EaterDog是类
  • eat函数被重用
  • eat未绑定(bind)
  • 使用原型(prototype)
  • 不支持多重继承


  • class Eater {
    eat(amount) {
    console.log(this.name + ' is eating');
    this.energy += amount;
    }
    };

    class Dog extends Eater{
    constructor (name, energy, breed) {
    super();
    Object.assign(this, {
    name,
    energy,
    breed
    })
    }
    };

    const leo = new Dog('Leo', 10, 'Pug');
    leo.eat(10); // Leo is eating
    console.log(leo.energy); // 20
    console.log(leo instanceof Dog) //true
    console.log(leo instanceof Eater) //true

    关于javascript - 与散布对象的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009262/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com