2016-04-11 95 views
0

我在班上有一種方法,我不想公開。我想知道是否有可能從構造函數中訪問該方法?Javascript構造函數訪問自己的私有方法?

例如:

(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(); 

})(); 

我的道歉,如果這已經被問過,但是這可能嗎?

+0

對不起,我的代碼有錯誤,分配給原型的函數應該是自調用的。我正在嘗試「顯示原型模式」 - 這對我來說仍然是新的。 –

+0

我現在看到了。您可以在外部範圍內聲明'toggleOption',在IIFE內部,它仍然是「私人」的。但是這個「私人」和「公共」的概念並沒有過渡到JS,而不是傳統的OOP意義上的。 – elclanrs

+0

看看[this](http://stackoverflow.com/q/9248655/1048572)。 – Bergi

回答

1

是的,這是可能的:d

演示: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

注意:最重要的部分是'.bind(this)',它使對象實例可用於'toggleOption'函數。 – Hadrian

0

這取決於你爲什麼要公開這個。

如果,例如,要公開進行單元測試的目的是可變的,你可以這樣做:

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


return { 
    getOptions: getOptions, 
    gprivate: gprivate 
}; 
相關問題