私有和静态和继承变量!?或类似的

时间:2011-01-19 20:45:46

标签: javascript inheritance static

我正在构建一个系统,其中包含与此问题类似的详细信息:Can I have different copies of a static variable for each different type of inheriting class

除了它在JavaScript中!

我将有一组子类。在程序的生命周期中,每个子类都会创建很多实例。除了对所有子类共有的文件外,特定子类的每个实例都将具有不同的值。我不希望每个实例都有副本。我希望它是静态的(一个副本)。但是,每个不同的子类使用不同的文件。我希望每个子类继承FACT,它具有来自超类的文件。

  

编辑:快速摘要:

     

目标:创建一个构造函数的类   构造a的定义   子类,允许变量:     - 出现在每个子类中     - 特定子类的独特之处     - 由特定子类的所有实例共享(所有的一个副本)

尝试在代码中说明这一点:

var instance1ofSubclass1 = {
    staticVar:"SAMEVAL_1", // For brevity I'm showing how staticVar is  
                           // the same. It's notsupposed to be public.
    uniqueVar:"adsfasdf"
};
var instance2ofSubclass1 = {
    staticVar:"SAMEVAL_1",
    uniqueVar:"zxbvczbxc"
};
var instance3ofSubclass1 = {
    staticVar:"SAMEVAL_1",
    uniqueVar:"qwrtytry"
};

var instance1ofSubclass2 = {
    staticVar:"SAMEVAL_2", //<--notice the static var is different
                           //   between subclasses
    uniqueVar:"oipoiuu"
};
var instance2ofSubclass2 = {
    staticVar:"SAMEVAL_2",
    uniqueVar:"hljkhlj"
};
var instance3ofSubclass2 = {
    staticVar:"SAMEVAL_2",
    uniqueVar:"bnmbmbmnm"
};

我的班级定义可以这样:

var subclass1 = (function () {
    var staticVar = "SAMEVAL_1"
    return function (unique) {
        return {
            uniqueVar:unique
        };
    };
}());

var subclass2 = (function () {
    var staticVar = "SAMEVAL_2" //<-- different static variable
    return function (unique) {
        return {
            uniqueVar:unique
        };
    };
}());

现在,我想更进一步,为这些类创建一个超类。那就是我被困住的地方。我希望在每个子类中都有一个staticVar定义。我想从超类中获取它。

3 个答案:

答案 0 :(得分:0)

首先,编译器永远无法阻止您忘记某些内容,因为没有编译器。这是我们不得不生活的东西。

我建议您使用原型设计。如果超类的原型包含您的变量,则相同的实例将用于所有子类。而且你不必在你的子类文件中重复自己。静态和继承,可以这么说。

MySuperClass.prototype.myStaticVar = "giantFile";

这个解决方案的缺点是变量不会真正私有。另一方面,你真的,真的需要私人吗?

无论如何,隐私的概念有点滑稽。在C / C ++中,所有东西(私有东西)都可以通过pointer-magic访问。在C#中,您可以使用反射来更改私有变量。没有什么是私密的。 JavaScript甚至更有趣,因为浏览器中的脚本可以由最终用户自己更改!在我看来,隐藏在明显的视线中是这种情况下的方法。适当地命名您的变量(例如,在其名称的开头添加一个或两个下划线以表示“隐私”)。

答案 1 :(得分:0)

如果我正确读到这个,我遇到了类似的问题。检查我几周前发布的SO question

为了更进一步,我的.add()方法检查传入的命名空间是否附加了supr对象,如果没有,则它附加名为{{1的基础对象到该命名空间,以便它可以轻松访问根。

答案 2 :(得分:0)

我想我已经明白了。

小提琴:http://jsfiddle.net/zXMaM/

我创建的模式通过另一个函数(本质上是超类)发送一个类定义,该函数为必要的私有静态变量创建一个额外的闭包,同时扩充由传入的类创建的对象来访问私有静态变量。

这很难解释,因为这对我来说也是新的,但希望在代码和我的评论之间是可以接受的。

“超类”方法:

var superClass = function (yourPrivateStaticVar, classDef) {        
    var privateStatic = yourPrivateStaticVar;

    return function () { // return a new constructor (only invoked when a new 
                         // instance is created!)

        // run the constructor, grab the object it creates
        var newObj = classDef();

        // now, augment the object created (these vars/methods have no 
        // knowledge of the subclass!)

        //add private vars/methods to the object
        function getPrivStatic() {
            return privateStatic;
        }

       var example_inherited_private_var;

        //add public vars/methods to the object
        newObj.getPrSt_directly = function () {
            return privateStatic;
        }

        newObj.getPrSt_throughPrivateFunc = function () {
            return getPrivStatic();
        }

       newObj.example_inherited_public_var = "something";

        //return the augmented object (a new *instance* of the subclass)
        return newObj;
    };
};

定义“子类”:

//pass the definition of subclass1 through the superclass method and get it back
var subClass1 = superClass("yourChosenPrivateStaticValue", function () {
    //private variables/methods go here

    return { //this is the actual instance object
        //public variables/methods go here
    };
});

再次,小提琴:http://jsfiddle.net/zXMaM/