2011-06-15 72 views
0

對於一個新項目,我需要編寫一個JavaScript庫,我不知道如何構造它。我昨天在stackoverflow上閱讀了許多文章和問題。自己的JavaScript庫的體系結構

我喜歡支持公共和私人功能和類。所以這裏是我的結果:

(function(window) { 

    var Library = Library || {}; 

    // Library namespace 
    Library = (function() { 
     function privateFunc() { 
      return "I'm a private functon in Library."; 
     } 
     var privateClass = function(param) { 
      var _param = param;  
     } 
     return { 
      constructor: Library, 
      publicFunc: function() { 
       return "I'm a publicFunc functon in Library."; 
      } 
     }; 
    })(); 

    // String namespace 
    _namespace('String'); 
    Library.String = (function() { 
     function privateFunc() { 
      return "I'm a private functon in Library.String."; 
     } 
     return { 
      constructor: Library.String, 
      publicFunc: function() { 
       return "I'm a publicFunc functon in Library.String."; 
      }, 
      publicClass: function(param) { 
       var _param = param; 
      } 
     }; 
    })(); 

    // global function 
    function _namespace(name) { 
     ... 
    } 

    // register libary 
    window.Library= window.$L = Library; 

})(window); 

這是一個很好的方法來構建一個圖書館或有更好的方法嗎? 如何爲我的privateClass/publicClass實現私有和公共函數?

謝謝

+1

還有其他的JavaScript框架,可以爲你做這個,如jQuery,MooTools的,樣機等,如果你真的你想自己做這個,你爲什麼不看看他們的代碼庫? – Spoike 2011-06-15 06:41:37

+0

閱讀['underscore'](http://documentcloud.github.com/underscore/docs/underscore.html)。使用該結構。 – Raynos 2011-06-15 06:45:11

+0

@Spoike爲他做什麼?他正在撰寫一個任意圖書館,並想知道如何構建他的文件。 jQuery,Mootools,原型等不會幫助他 – Raynos 2011-06-15 06:47:22

回答

2

javascript中沒有私有/公共函數的概念。按照約定,以下劃線開頭的函數被認爲是私有的。

+3

不是真的:'function(){var privateFn = function(){}; }' – 2011-06-15 06:43:46

+0

是的,但是你可以像「cwolves」例子一樣在「類」中使用函數,所以它們不能從課程外部訪問。 – Torben 2011-06-15 06:55:25

+1

@cwolves您似乎將「local」和「scope」混淆了一些通用的隱私概念,這種隱私概念在這種語言中並不存在。 – Raynos 2011-06-15 07:15:20

0

只是爲了Raynos一塌糊塗(我寫這篇年前):

私有,公共和靜態變量

,我們在我們的對象定義變量的方式決定用什麼方法我們的對象有可用於訪問這些變量。在JavaScript中,使用OO代碼時有五個方法和屬性級別。

  • Private在對象內聲明'var variableName'或'function functionName'。只能由其他私人或特權功能訪問。

  • Public在對象內部聲明'this.variableName'。可以通過任何功能或方法進行更改。

  • 特權在對象內部聲明'this.functionName = function(){...}'。可以通過任何函數或方法訪問,並可以調用引用或更改任何私有變量。

  • 原型聲明與'Class.prototype.variableName'或'Class.prototype.functionName'。以這種方式聲明的函數將可以訪問任何公共或原型變量。試圖改變這種方式創建的變量會改爲在對象上創建一個新的公共變量,原型變量將不可用。

  • 使用'Class.variableName'或'Class.functionName'靜態聲明。可以通過任何功能或方法進行更改。這種方法很少使用。 要了解這些不同的級別,讓我們來看一個例子:


function Cat(name, color){ 

    /* 
    Constructor: any code in here is run when the object is created 
    */ 
    Cat.cats++; 

    /* 
    Private variables and functions - may only be accessed by private or privileged functions. 

    Note that 'name' and 'color', passed into the Class, are already private variables. 
    */ 
    var age = 0; 
    var legs = 4; 
    function growOlder(){ 
     age++; 
    } 

    /* 
    Public variables - may be accessed publicly or privately 
    */ 
    this.weight = 1; 
    this.length = 5; 

    /* 
    Privileged functions - may be accessed publicly or privately 
    May access Private variables. 

    Can NOT be changed, only replaced with public versions 
    */ 
    this.age = function(){ 
     if(age==0) this.length+=20; 

     growOlder(); 
     this.weight++; 
    } 
} 

/* 
Prototyped Functions - may be accessed publicly 
*/ 
Cat.prototype = { 
    talk:  function(){ alert('Meow!'); }, 
    callOver: function(){ alert(this.name+' ignores you'); }, 
    pet:  function(){ alert('Pet!'); } 
} 

/* 
Prototyped Variables - may be accessed publicly. 
May not be overridden, only replaced with a public version 
*/ 
Cat.prototype.species = 'Cat'; 

/* 
Static variables and functions - may be accessed publicly 
*/ 
Cat.cats = 0; 
+0

Ew。錯誤的術語。所以2005年。不要把Java帶入我的JavaScript!說真的,我們並沒有真正回答他的問題,只是有一個噪音論證。 – Raynos 2011-06-15 07:40:56

+0

是的,那麼我在2005年寫了這個我認爲:) – 2011-06-15 07:44:08

+0

但讀起來很有意思;) – Torben 2011-06-15 07:47:39