自己的JavaScript库的体系结构

Architecture for own JavaScript library

本文关键字:体系结构 JavaScript 自己的      更新时间:2023-09-26

对于一个新项目,我需要写一个JavaScript库,但我不知道如何构建它。昨天我在stackoverflow上读了很多文章和问题。

我喜欢支持公共和私人功能和类。这是我的结果:

(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实现私有和公共函数?

感谢

javascript中没有私有/公共函数的概念。按照惯例,以下划线开头的函数被视为私有函数。

只是为了惹Raynos(我几年前写的):

私有、公共和静态变量

我们在对象中定义变量的方式决定了我们的对象有哪些方法可以访问这些变量。在JavaScript中,使用OO代码时有五个级别的方法和属性。

  • Private在对象内部声明为"var variableName"或"function functionName"。只能由其他专用或特权功能访问。

  • Public在对象内部声明为"this.variableName"。可以通过任何函数或方法进行更改。

  • 在对象内部使用"this.functionName=function(){…}"声明的特权。可以由任何函数或方法访问,也可以调用引用或更改任何Private变量。

  • Prototype用"Class.protype.variableName"或"Class.protoype.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;