Создание класса Javascript - PullRequest
       0

Создание класса Javascript

2 голосов
/ 23 февраля 2012

В настоящее время я использую этот стиль для создания структуры типа js:

   var JSClass  =   (function(){
       console.log('JSClass Init');
       //-- Set up private var and fnc here
       var opt  =   {
              width:    0,
           height:  60
           }

       function _PrivateSum(g){
           return (g * opt.width);
       }

       //-- Set up public access here
       function JSClass(){ //the class constructor
           //-- class attributes

       }
           //-- class methods
       JSClass.prototype    =   {
           getWidth : function(){
               return _PrivateSum(opt.width);
           },
           setWidth : function(w){
               console.log('JSClass setWidth: ' + w);
               opt.width    =   w;
           },
           getHeight : function(){
               console.log('JSClass getHeight');
               return opt.height;
           },
           setHeight : function(h){
               opt.height = h;
           }

           };

           return JSClass;

   }());

init, вызывая следующее на другой странице:

   var jc   =   new JSClass();

Это все хорошо, но еслиЗатем мне нужно создать класс, который я хотел бы использовать несколько раз на одной странице: var jc = new JSClass ();var jc2 = new JSClass ();

В настоящее время, если я что-то изменяю в первом «jc», он также контролирует, что находится во втором «jc2».

Так что мой вопрос: какхотел бы я создать свежий экземпляр моего класса JSClass (), чтобы я мог управлять каждым из них по отдельности, не влияя на текущий, аналогично классам php и т. д.

Я считаю, что мне нужно каким-то образом создать клоноригинала, но я не уверен, или если есть лучший способ, чем выше, пожалуйста, не стесняйтесь сообщить мне

высоко ценится

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Мне нравится использовать такую ​​конструкцию: note: нет нового оператора.

//definition
var myClass = function() {
    var abc = 1; //private properties

    function f1() {...}; //private methods

    return {
        bar: function() {} //public function *with* access to private members and functions
    };
};

//usage:

var myInstance1 = myClass();
var myInstance2 = myClass();
1 голос
/ 23 февраля 2012

Все экземпляры вашего класса будут использовать один и тот же объект opt, поэтому изменение его в одном экземпляре изменит его и для всех остальных экземпляров.

Вам придется переместить opt в конструкторфункция.Функции прототипа, кроме свободного доступа к opt, конечно.Если вы хотите использовать функциональный подход для классов с закрытыми членами, вы должны отказаться от красоты прототипа, и наследование будет сложным.Но вы получите настоящих частных членов.

«Хорошие части» Крокфорда - это чтение, которое я бы рекомендовал для этих вещей.

1 голос
/ 23 февраля 2012

Ваши переменные ("opt") STATIC (переменные класса - то есть общие для всех экземпляров класса), а не переменные экземпляра.Переменные экземпляра - это свойства объекта "this", который вы создаете в конструкторе и / или в двух имеющихся у вас функциях set (ter).В setWidth, setHeight замените opt.width (или height) на this.width (или height) и удалите статическую переменную «opt».

Кроме того, переместите _PrivateSum в объект-прототип, иначе у вас возникнут проблемы с доступом кНовая переменная экземпляра только что введена - если вы не вызываете ее с помощью _PrivateSum.call (this, this.width), потому что при вызове этого, как вы делаете сейчас, «this» будет неправильным, но если это метод экземпляра, и вы вызываете его с этим._PrivateSum (...) внутри него «this» будет указывать на правильный объект.

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