2016-04-11 40 views
0

Sınıfımda, herkese açık olmak istemediğim bir yöntem var. Metodu kurucudan erişmek mümkün olup olmadığını merak ediyorum? Javascript kurucu?

(function() { 
    var Config = function() { 
     this.data = this.getOptions(); 
     var options = document.querySelector('.options'); 
     options.addEventListener('click', this.toggleOption, false); 
    }; 

    Config.prototype = function() { 
     var getOptions = function() { 
      // public method 
     }, 

     toggleOption = function() { 
      // private method 
     }; 

     return { 
      getOptions: getOptions 
     }; 
    }(); 

    var config = new Config(); 

})(); 

Benim özür

bu daha önce sorulmuş olup olmadığını, ancak bu mümkündür: Örneğin

?

+0

Üzgünüm, kodumda bir hata vardı, prototipe atanan fonksiyonun kendi kendini çağırması gerekiyordu. "Prototip Deseni Açığa Çıkarma" yi deniyorum - hala benim için yeni. –

+0

Şimdi anlıyorum. 'FEggOption'unu dış kapsamda, IIFE'nin içinde ilan edebilirsiniz, yine de "özel" olacaktır. Fakat bu "özel" ve "kamusal" kavram, klasik OOP anlamında değil, JS'ye çok iyi transfer olmaz. – elclanrs

+0

[this] 'a bir göz atın (http://stackoverflow.com/q/9248655/1048572). – Bergi

cevap

1

Evet, bu mümkün: D

Demo: https://jsbin.com/xehiyerasu/

(function() { 
    var Config = (function() { 
    function toggleOption() { 
     console.log('works') 
    } 

    var Config = function() { 
     this.data = this.getOptions(); 
     var options = document.querySelector('.options'); 
     options.addEventListener('click', toggleOption.bind(this), false); 
    }; 

    Config.prototype = (function() { 
     var getOptions = function() { 
      // public method 
     }; 
     return { 
      getOptions: getOptions 
     }; 
    })(); 

    return Config; 
    })(); 

    var config = new Config(); 

    console.log('Is toggleOption private? ', !config.toggleOption) 

})(); 
+0

Not: En önemli kısım, nesne örneğini 'toggleOption' işlevine sunan' .bind (this) 'dır. – Hadrian

0

NEDEN NASIL bunu açıklamak istediğinize bağlıdır.

mesela, birim test amaçlı olduğunu değişken sergilemek istediğiniz, varsa, böyle bir şey yapabileceğini:

if (window.someUnitTestingGlobal) { 
    var gprivate = { 
    toggleOption: toggleOption 
    }; 
} 


return { 
    getOptions: getOptions, 
    gprivate: gprivate 
};