2017-05-09 62 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

要在工廠模式下實現繼承,其原始工廠類將接受配置對象。更具體的工廠通過傳入對象來擴展原始的工廠類。