我正在构建一个系统,其中包含与此问题类似的详细信息: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定义。我想从超类中获取它。
答案 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/