使用工厂方法/类模式继承

eol*_*eol 1 javascript inheritance

我正在阅读JavaScript中不同的对象创建方法,而不是使用new和ES6类.一种方法是使用工厂方法/工厂类模式(取自https://medium.com/humans-create-software/factory-functions-in-javascript-video-d38e49802555):

const dog = () => {
  const sound = 'woof'
  return {
    talk: () => console.log(sound)
  }
}
const sniffles = dog()
sniffles.talk() // Outputs: "woof"
Run Code Online (Sandbox Code Playgroud)

我如何实现一个类似于Animal或更确切地说我的狗功能可以"继承"的另一个工厂功能?我会将动物对象传递给dog函数并将对象的原型设置为返回传递的动物对象吗?

Mat*_*zer 5

你会用Object.create:

const animal = () => ({
  talk: function() {
    console.log(this.sound);
  }
});

const dog = () => Object.create(animal(), {
  sound: {
    value: "woof"
  }
});

// or...

const dog2 = () => {
  var someDog = Object.create(animal());
  someDog.sound = "woof";

  return someDog;
};

var someDog = dog();
someDog.talk();

var someDog2 = dog2();
someDog2.talk();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我的观点是你应该使用ES2015 +类/继承并留下自定义工厂的使用,并Object.create在你真正需要的情况下使用它们:

class Animal {
  talk() {
    return console.log(this.sound);
  }
}

class Dog extends Animal {
  constructor() {
    super();
    this.sound = "woof";
  }
}

var dog = new Dog();
dog.talk();
Run Code Online (Sandbox Code Playgroud)