2014-06-21 3 views
0

Этот образец достигает частных переменных прямоугольника. Переменные myLength и myWidth отличаются для разных экземпляров. Так почему же это не рекомендуется?Javascript: получение личных переменных через анонимный объект возврата

var rectangle = function() { 
    var myLength = 8; 
    var myWidth = 6; 

    var getMyLength = function() { 
     return myLength; 
    }; 

    var setMyLength = function (value) { 
     myLength = value; 
    }; 

    var getMyWidth = function() { 
     return myWidth; 
    }; 

    var setMyWidth = function (value) { 
     myWidth = value; 
    }; 

    var drawFigure = function() { 
     console.log("Draw invoked for figure: " + 
      getMyLength() + " * " + getMyWidth()); 
    }; 

    return { 
     getMyLength: getMyLength, 
     setMyLength: setMyLength, 
     getMyWidth: getMyWidth, 
     setMyWidth: setMyWidth, 
     drawFigure: drawFigure 
    } 
}; 

Затем мы используем его следующим образом:

var myRectangle = new rectangle(); 

myRectangle.drawFigure();   // Draw invoked for figure: 8 * 6 

myRectangle.setMyLength(3); 

myRectangle.setMyWidth(5); 

myRectangle.drawFigure();   // Draw invoked for figure: 3 * 5 

var myRectangle1 = new rectangle(); 

myRectangle1.drawFigure();   // Draw invoked for figure: 8 * 6 
+4

* «Так почему же это не рекомендуется?» * Кто сказал, что это не рекомендуется? Это очень распространенный подход, когда вам необходимо защитить переменные. –

+1

... и 'new rectangle();' может быть просто 'rectangle();'. Нет смысла выделять новый объект, если вы проигнорируете его и вернете другое. –

+0

@cookiemonster Спасибо. Я вижу много примеров, используя this.length и this.width вместо var. Почему вы используете this.methods? Одна примерная страница, которую я использую, чтобы узнать: http://phrogz.net/JS/classes/OOPinJS.html – bschandramohan

ответ

2

По моему мнению, частные переменные переоценены. Вам действительно нужно скрывать вещи от программиста? Нет. Даже если вы сделали все ваши личные переменные общедоступными, какая разница? На самом деле я выступаю за то, чтобы сделать все публичным, потому что:

  1. Это облегчило бы отладку. Если вы используете объект console.log, вы можете проверить его общедоступные свойства, что облегчает отладку, поскольку вы можете видеть состояние объекта.
  2. Вам не нужно создавать ненужные затворы. Если вы хотите получить приватную переменную, а также хотите, чтобы она была доступна публичному методу, вам нужно создать закрытие (по одному для каждого экземпляра). Если вы публикуете свои свойства, вам не нужны закрытия. Вы можете поместить методы в прототип. Следовательно, у вас будет только один метод для каждого класса, который будет использоваться всеми экземплярами.
  3. Вам не нужно создавать ненужные геттеры и сеттеры. Что нужно сделать переменной private, а затем разрешить кому-либо изменять ее с помощью функций getter и setter? Вы также можете сделать переменную открытой.

    Геттеры и сеттеры, по моему скромному мнению, только полезны для свойств фантомных:

    var Person = defclass({ 
        constructor: function (firstName, lastName) { 
         this.firstName = firstName; 
         this.lastName = lastName; 
        }, 
        getFullName: function() { 
         return this.firstName + " " + this.lastName; 
        }, 
        setFullName: function (fullName) { 
         var name = fullName.split(" "); 
         this.firstName = name[0]; 
         this.lastName = name[1]; 
        } 
    }); 
    

Таким образом, на мой взгляд, вы должны написали свой Rectangle класс следующим образом:

var Rectangle = defclass({ 
    constructor: function (width, height) { 
     this.width = width; 
     this.height = height; 
    } 
}); 

Затем мы используем его следующим образом:

var rectA = new Rectangle(8, 6); 

console.log(rectA);    // { width: 8, height: 6 } 

rectA.width = 3; 
rectA.height = 5; 

console.log(rectA);    // { width: 3, height: 5 } 

var rectB = new Rectangle(8, 6); 

console.log(rectB);    // { width: 8, height: 6 } 

Наконец, определение defclass:

function defclass(prototype) { 
    var constructor = prototype.constructor; 
    constructor.prototype = prototype; 
    return constructor; 
} 

Так что это только мои два цента на пути вы должны создавать объекты в JavaScript.

+1

Getters and setters также полезны, когда вам нужно ограничить/проверить соответствие установленному значению. –

+1

Это зависит от того, хотите ли вы, чтобы ваша логика проверки была частью вашего класса. На мой взгляд, логика проверки не относится к самому классу. Легче просто предположить, что любая модификация объекта действительна, а не защищена кодом. Я бы предпочел написать отдельную функцию для проверки: 'if (isValid (value)) object.property = value;'. При этом вы отделяете свою логику проверки от сеттера, позволяя повторно использовать его в других местах. Кроме того, вы сами делаете проверку достоверной, уменьшаете сложность своего класса и уменьшаете связь между ними. –

+2

Скрыть реализацию от вашего общедоступного api. На других языках, где ваша программа зависит от множества других модулей, нужен только один плохой программист, который взломан и зависит от реализации. Когда модуль обновляется, он может сломать все, даже если обновленная часть имеет один и тот же общий api. Что, как говорится; Я не пользуюсь им – HMR

Смежные вопросы