Частные И Статические И Унаследованные переменные! Или похожие - PullRequest
2 голосов
/ 19 января 2011

Я строю систему с деталями, похожими на этот вопрос: Могу ли я иметь разные копии статической переменной для каждого другого типа наследуемого класса

Кроме того, что в JavaScript!

У меня будет набор подклассов.У каждого подкласса будет много экземпляров, созданных из него в течение жизни программы.Каждый экземпляр определенного подкласса будет иметь разные значения, за исключением файла, который является общим для всех.Я не хочу, чтобы у каждого экземпляра была копия.Я хочу, чтобы это было статично (одна копия для всех).Каждый отдельный подкласс использует другой файл.Я хочу, чтобы каждый подкласс наследовал ФАКТ, что он имеет файл из суперкласса.

РЕДАКТИРОВАТЬ: Краткое резюме:

цель: создать класс, которыйконструктор, который создает определение подкласса, допуская переменную: - появляется в каждом подклассе - уникален для конкретного подкласса - используется всеми экземплярами определенного подкласса (одна копия для всех)

Попыткаиллюстрируя это в коде:

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 голосов
/ 20 января 2011

Если я правильно понял, у меня была похожая проблема, которую вы сделали. Отметьте этот ТАК * вопрос , который я разместил несколько недель назад.

Чтобы сделать этот шаг дальше, мой метод .add() проверяет, имеет ли переданное в пространство имен объект supr, присоединенный к нему, если нет, то он добавляет базовый объект с именем supr к этому пространству имен, так что он может иметь легкий доступ к корню.

0 голосов
/ 21 января 2011

Мне кажется, я понял это.

Скрипка: 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/

0 голосов
/ 20 января 2011

Прежде всего, компилятор никогда не сможет помешать вам что-то забыть, так как нет компилятора.Это то, без чего нам придется жить.

Я бы предложил вам использовать для этого прототипы.Если прототип суперкласса содержит вашу переменную, один и тот же экземпляр будет использоваться для всех подклассов.И вам не придется повторяться в ваших файлах подкласса.Статические и унаследованные, так сказать.

MySuperClass.prototype.myStaticVar = "giantFile";

Недостатком этого решения является то, что переменная на самом деле не будет частной.С другой стороны, вам действительно нужно, чтобы это было приватно?

В любом случае, понятие конфиденциальности немного забавно.В C / C ++ все (и частные вещи тоже) могут быть доступны с помощью указателя-магии.В C # вы можете использовать отражение для изменения приватных переменных.Ничто не является действительно частным.JavaScript еще забавнее, поскольку сценарии в браузере могут быть изменены самим конечным пользователем!На мой взгляд, в этом случае нужно прятаться на виду.Назовите вашу переменную соответствующим образом (например, добавьте подчеркивание или два в начале ее имени, чтобы обозначить «конфиденциальность»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...