Почему бы не использовать замыкания для атрибутов объектов?

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

Так что у меня возникла идея - почему бы просто не использовать замыкания для атрибутов объекта? Посмотрите на мой пример объекта. Итак, вместо этого, классический способ:

var MyObjConstructor = function (a, b) {

    // constructor - initialization of object attributes
    this.a = a;
    this.b = b;
    this.var1 = 0;
    this.var2 = "hello";
    this.var3 = [1, 2, 3];

    // methods
    this.method1 = function () {
        return this.var3[this.var1] + this.var2; 
            // terrible - I must always write "this." ...
    };

}

... Я бы сделал это , используя закрытие , и тогда мне не нужно было бы писать это. каждый раз для доступа к атрибутам!

var MyObjConstructor = function (a, b) {

    // constructor - initialization of object attributes
    // the attributes are in the closure!!!
    var a = a;
    var b = b;
    var var1 = 0;
    var var2 = "hello";
    var var3 = [1, 2, 3];

    // methods
    this.method1 = function () {
        return var3[var1] + var2;
            // nice and short
    };

    // I can also have "get" and "set" methods:
    this.getVar1 = function () { return var1; }
    this.setVar1 = function (value) { var1 = value; }
}

Кроме того, у него есть скрытое преимущество, заключающееся в том, что к атрибутам действительно нельзя получить доступ иначе, как с помощью методов get / set !!

Итак, вопрос:

  1. Это хорошая идея? Является ли он «чистым», соответствует ли он лучшим практикам?
  2. Есть ли какие-либо другие семантические различия между этими двумя решениями?
  3. Есть ли какие-нибудь ловушки с использованием такого закрытия?
9
задан TMS 20 October 2011 в 11:10
поделиться