Trois façons différentes d'utiliser les fonctions javascript, mais je ne connais pas les avantages et les inconvénients pour cela. Quelqu'un pourrait-il expliquer les différences?

J'ai trois façons de faire fonction et de le renvoyer. (Peut-être qu'il y en a plus?) Mais je ne connais pas le différent entre eux et quand utiliser. Quelqu'un pourrait-il expliquer.

var test1 = function() { var funk1 = function() { console.log(1); } var funk2 = function(msg) { console.log(msg); } return { funk1: funk1, funk2: funk2 } }; var test2 = function() { this.funk1 = function() { console.log(1); } this.funk2 = function(msg) { console.log(msg); } }; var someThing = test1(); someThing.funk1(); someThing.funk2(2); var someThing = new test1(); someThing.funk1(); someThing.funk2(2); var thingElse = new test2(); thingElse.funk1(); thingElse.funk2(2); 

Il s'agit du module / bibliothèque / modèle de plugin

 var test1 = function() { var funk1 = function() { console.log(1); } return { funk1: funk1 } }; 

C'est le modèle OOP (Object-Oriented-Programming)

 var test2 = function() { this.funk1 = function() { console.log(1); } }; 

Différence

 var t = test1() //function call, t is result of test1 function execution var t = new test1() //instance initialization, t is instance of test1 class 

Considérez ce modèle simple

Nous avons un fabricant qui fabrique des voitures, le fabricant dispose de certaines méthodes et une voiture a ses propres méthodes, nous ne modifierons pas les propriétés publiques du fabricant, mais nous ne pouvons toujours pas accéder à la technologie utilisée par le fabricant pour créer une voiture. Boîte noire, qui expose certains accessoires publics, et ne peut pas être ajustée.

 //service for creating/controlling manufactorer var ManufacturerService = function(companyName) { var self = this; self.companyName = companyName; //encapsulation var Car = function(name, number){ var createdAt = new Date(); var engineStarts = 0; //instance property, doesn't have setter Object.defineProperty(this, 'info', { get: function(){ return { name: name, createdAt: createdAt, engineStarts: engineStarts } } }); //instance method this.startEngine = function(){ //private property, available only on instance, and cannot be extracted engineStarts++; //reference to ManufacturerService.companyName console.log(self.companyName + ' ' + name + ':' + number + ' engine Started'); } } var createCar = function(name){ //check cache/duplication/validation //or use custom behavior var carNumber = ManufacturerService.genShortUid(); return new Car(name, carNumber); } var getName = function(){ return self.companyName; } return { getName: getName, createCar: createCar } }; //static method, this can be overriden by 3rdParty or user ManufacturerService.genShortUid = function genShortUid() { return ('0000' + (Math.random()*Math.pow(36,4) << 0).toString(36)).slice(-4); } 

Utilisation, le service ManufacturerService est écrit en tant que plugin / bibliothèque, mais notez que le modèle de voiture est entièrement encapsulé, ce qui signifie que le modèle est totalement caché du monde extérieur

 //create a service instance var VolvoCompany = new ManufacturerService('Volvo'); //access encapsulated Car model by createCar method //which is available only on instance of service var Golf = VolvoCompany.createCar('Golf'); //instance method of car Model Golf.startEngine(); //logs Volvo Golf:vnv6 engine Started Golf.info //returns Object {name: "Golf", createdAt: Sat Feb 13 2016 17:39:57 GMT+0600 (ALMT), engineStarts: 1} //try to hack car instance Golf.info.name = 'test'; Golf.name = 'test'; Golf.info //returns same object, as Car model doesn't have exported setters Object {name: "Golf", createdAt: Sat Feb 13 2016 17:39:57 GMT+0600 (ALMT), engineStarts: 1} //customize guid generator of ManufacturerService ManufacturerService.genShortUid = function(){ return '1111'; } //reuse same service for another Car model var Mazda = VolvoCompany.createCar('Mazda'); //instance method of car Model Mazda.startEngine(); //logs Volvo Mazda:1111 engine Started 

Résumé

ManufacturerService exporte une quantité limitée de méthodes et totalement ouvert, mais l'instance de Car est totalement encapsulée et même pas visible

Les modifications / suggestions / commentaires sont les bienvenus