2017-05-09 58 views
1

我正在阅读有关使用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" 

我将如何实现像Animal类或而另一家工厂funtion它我的狗功能,可以从“继承”?我是否会将动物物体传递给狗功能,并将物体的原型设置为传回的动物物体?

+1

你想要达到什么目的?你可能不需要继承。 – nils

+0

只要使用扩展:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/extends –

+0

只是问一般,但例如动物类可以实现其所有子类的行为想要实施。或者像move()这样的方法会被某些子类覆盖。 – eol

回答

3

你说什么将使用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();

顺便说一句,我的观点是,你应该与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();

+0

谢谢,这就是我的意思! :) – eol

+0

@eol没问题! ;) –

1

@nils是正确的,目前还不清楚为什么你要继承什么/,所以我只是猜测,但也许这是你的意思:)

const animal = (sound) => { 
 
    return { 
 
    talk:() => console.log(sound) 
 
    } 
 
} 
 
const dog =() => animal('woof') 
 
const sniffles = dog() 
 
sniffles.talk() // Outputs: "woof"

+0

这是一种可能的方法 –

0

另外对于这些其他答案,我建议看看这本关于Javascript设计模式的优秀书籍,Learning JavaScript Design Patterns

特别是,看看它的章节factories

要在工厂模式下实现继承,其原始工厂类将接受配置对象。更具体的工厂通过传入对象来扩展原始的工厂类。