【问题标题】:Does anyone know of a robust JavaScript pseudoclass class?有人知道健壮的 JavaScript 伪类吗?
【发布时间】:2013-02-17 02:50:37
【问题描述】:

我正在寻找一种相对简单但有效的机制来实现干净的外观:

  • 公共、私有和受保护成员(具有实际的公共/私有/受保护访问权限,但仍可扩展)
  • 继承(单个或多个)
  • 构造函数重载(最好不必计算 args 并使用一组复杂的嵌套条件检查类型)

【问题讨论】:

  • @Xymotech - 您可以在闭包中使用局部变量实现“私有”的等效项。
  • @nnnnnn 公平点。不过,“受保护”仍然存在。
  • 而且 javascript 确实具有简单的继承,在美好的一天可以称为重载,以及使变量不可访问的方法。在我看来,OP 正在寻找某种类,就像你在许多 C 语言中所拥有的那样,它可以在 javascript 中解决所有这些问题,而那个 afaik 并不存在。

标签: javascript inheritance scope pseudo-class overloading


【解决方案1】:

好吧...在写这篇文章之前给自己泡了杯咖啡。唯一我不能帮助你的是超载。不过没关系,我们开始吧:

// Class pattern with
//    - dynamic prototypes
//    - public, private, static, static private members
// Keeps functions named the way you want it to.
// Working example:
var YourClass = (function(){

    var Pseudo = function(){
        var args = arguments;

        // constuct the instance in here:
        var YourClass = function(){
            var public = this,
                private = {};

            public.foo = args[0] ? args[0] : "bar";
            public.staticPrivateInt = ++static_private.someInt;

            private.fibo = "nacci";

            // fibo is private - return it's value
            // with a getter to make it "protected"
            public.getFibo = function(){
                return private.fibo;
            }

            public.setFibo = function(value){
                if(typeof value === "string"){
                    // handle optional events here
                    return private.fibo = value;
                }else{
                    return false;
                }
            }
        };


        var static = Pseudo,
                 static_private = {};

        // statics:
        static_private.someInt = 100;
        static.increaseSomeInt = function(){
            ++static_private.someInt;
        }


        // extend on creation of an instance:
        YourClass.prototype = args[0] || new Object();  // or anything else, just an example

        return new YourClass;
    };
    return Pseudo;

}());

用法:

var myInstance = new YourClass({
    someCfg: true
});

console.log(myInstance.someCfg === true); // will log true

由于 JavaScript 的词法作用域和闭包,我们确实可以模拟类在其他语言(如 C++、Java 等)中的设计方式。

使用该模式时请记住以下几点:

  1. 静态、私有或公共等变量名称会导致错误 在严格模式下。如果需要,您可以重命名它们。
  2. 静态私有变量不应存储为static.private,因为它们不再是私有的(因此变量static_private)。

工作原理

基本上,你想要的是:

  1. public 成员可通过<object>.<member> 访问。在 Javascript 中,这通常使用 this.<member> = <assignment>; 完成。

    => 为方便起见,创建一个简单的别名: var public = this;

  2. private 成员在构造函数中可见,但在实例中不可见。仍然需要public 方法可以访问它们。

    => var private = {}; 您可以创建简单的变量,例如var fibo="nacci";,但我发现private.fibo="nacci"; 更具可读性。使用 var 关键字创建的任何变量都无法从构造函数的外部范围访问。

  3. static 成员准备好即使尚未创建类的实例。在 JavaScript 中执行此操作的常用方法是为构造函数本身分配一个值或函数。见 SO 问题here

    => 同样,为了可读性: var static = Pseudo;

  4. static private members:有时,您可能希望拥有在构造函数之外不可见的静态成员。

    => 使用词法范围来存储它们。 var static_private = {};

关于类模式的进一步阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多