【问题标题】:Architecture for own JavaScript library自己的 JavaScript 库的架构
【发布时间】:2011-09-15 06:52:53
【问题描述】:

对于一个新项目,我需要编写一个 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 框架可以为你做这件事,例如 jQuery、mootools、prototype 等。如果你真的想自己做,为什么不看看他们的代码库?
  • 阅读underscore。使用该结构。
  • @Spoike 为他做了什么?他正在编写一个任意库,并想知道如何构建他的文件。 jQuery、Mootools、原型等对他没有帮助
  • @Spoike 是的,我们也在使用 jQuery。我不想编写自己的框架,而是构建自己的 JavaScript 代码。 @Raynos 你是对的,谢谢你的链接。
  • @Raynos:类的处理和这些都可用。我只是作为一个提示说,如果你正在编写一个任意库,那么你应该阅读其他框架是如何做到的。有很多,随便挑吧。 :-)

标签: javascript


【解决方案1】:

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

【讨论】:

  • 不是真的:function(){ var privateFn = function(){}; }
  • 是的,但是您可以在“类”中使用函数,例如 cwolves 示例,因此无法从类外部访问它们。
  • @cwolves 您似乎将localscope 与该语言中不存在的一些通用隐私概念混淆了。
  • @Raynos - 我没有混淆这两者,我是说我的示例 作用 就像一个私有函数。如果它看起来像鸭子,听起来像鸭子,行为也像鸭子......
  • @cwolves 没有什么隐私的。 The instance variables in strawman are private。闭包和局部变量以及绑定到对象的私有数据之间有明显的区别。
【解决方案2】:

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

私有、公共和静态变量

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

  • 在对象内部使用“var variableName”或“function functionName”声明的私有。只能由其他私有或特权函数访问。

  • 在对象内部使用“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;

【讨论】:

  • Ew。错误的术语。所以 2005 年。停止将 Java 引入我的 JavaScript!说真的,虽然我们实际上并没有回答他的问题,只是在吵架。
  • 是的,我认为这是我在 2005 年写的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2014-09-25
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多