2016-02-13 11 views
5

Bir işlev oluşturmanın ve döndürmenin üç yolunu kullanıyorum. (Belki daha fazlası var mı?) Ama aralarındaki farkları ve ne zaman kullanacağımı bilmiyorum. Birisi lütfen açıklayabilir.Javascript işlevlerini kullanmanın üç farklı yolu, ancak ben artıları ve eksilerini bilmiyorum. Birisi farklılıkları açıklayabilir mi?

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); 
+0

modellerine hoşgeldiniz derslerine göz at. Neden iyi ve kötü olduklarına dair açıklamalarla birlikte bol miktarda eğitim. – epascarello

cevap

4

Bu

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

fark

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

düşünün modül/kütüphane/eklentisi desen

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

Bu OOP olan (Nesneye yönelik Programlama) paterni olup, basit model

Araba üreten bir üreticimiz var, üreticinin bazı yöntemleri vardır ve bir aracın kendi yöntemleri vardır, biz üreticinin kamuya ait özelliklerini değiştirmeyiz, ancak üreticinin bir araba oluşturmak için kullandığı teknolojiye erişemiyoruz. , bu yüzden araba siyah kutudur, bu da bazı halka açık gösteriler ortaya çıkarır ve düzeltilemez.

//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); 
} 

Kullanımı, ManufacturerService modeli tamamen dış dünyadan gizlendiği anlamına gelir ki, tamamen kapsüllü olduğu eklenti/kitaplık olarak yazılır, ama bu araba modeli fark edilir

//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 

Özeti

ManufacturerService ihracatı Sınırlı miktarda yöntem ve tamamen açık, ancak Car örneği tamamen kapsüllenmiş ve görünür durumda değil

düzenlemeler/öneriler/yorumlar

+0

test1() ve yeni test1() arasında bir fark var mı? aynı şeyi doğru yapmalılar mı? – pailhead

+0

'new test1()' örnek başlatılıyor, 'test1()' sadece –

+0

numaralı bir işlev çağrısıdır ancak her ikisi de bir nesneyi bir harfle döndürür. Sanırım ne soruyorum, başlık "üç farklı ..." diyor ama sadece iki farklı yolu gibi görünüyor. İlk ikisi aynı görünüyor. Farklı bir yol, işlevi çağırmak yerine test1'i bir tekton olarak kullanmaktır. Kapanışta hiçbir şey bulunmadığı ve bu işlevlerin davranışlarını değiştirecek hiçbir şey olmadığı için, bu özellikle bu şekilde kullanılabilir. – pailhead

İlgili konular