Лучший способ получить доступ к членам парламента, не занимающим официального поста в JavaScript

Чтобы вернуть число, добавьте еще один слой скобок. Содержит это в чистоте.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
7
задан Jeffrey04 25 June 2009 в 03:13
поделиться

3 ответа

Использование переменных области видимости функций и замыканий для имитации частных переменных / функций - хорошо известная идиома в сообществе javascript. Если переменная действительно предназначена быть частной, я не вижу недостатков в этом подходе (хотя некоторые утверждают, что производительный код в определенных браузерах / хостах должен обращать внимание на то, сколько создается замыканий).

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

Вот пример кода, который поможет проиллюстрировать, что происходит:

  var global = 1;

  var Some_Class = function() {
    var private_method = 'whatever';
    var now = ++global;
    print("outer now: " + now );
    private_method = function(_some_value) {
        // private method implementation
        print("inner now: " + now);
    };

    if(!arguments.callee.prototype.public_method) {
        arguments.callee.prototype.public_method = function() {

            private_method.call(this, private_method);
        };
    }

    (function() {
        // constructor
    }).call(this)
}

new Some_Class().public_method(); // outer now: 2, inner now: 2
new Some_Class().public_method(); // outer now: 3, inner now: 2
new Some_Class().public_method(); // outer now: 4, inner now: 2

Вы уверены, что это то, что вы хотите?

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

Что я обычно делаю (если мне нужно использовать «новый» для создания своего объекта), так это следующее:

function MyClass() {
  var private_var = 1; 
  function private_func()
  {

  }
  this.public_func = function() 
  {
     // do something
     private_func();
  }
  this.public_var = 10;
}

var myObj = new MyClass();

Обратной стороной этого подхода является то, что каждый раз, когда вы создаете объект с помощью «нового», вы заново создаете все закрытия. Но если мой профилировщик не скажет мне, что этот выбор дизайна должен быть оптимизирован, я предпочитаю его простоту и ясность.

Также я не вижу преимуществ в вашем коде от выполнения следующего:

  (function() { }).call(this);  // call the constructor

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

тогда я не вижу пользы в том, чтобы делать то, что делаете вы.

Что я обычно делаю (если мне нужно использовать «новый» для создания своего объекта), так это следующее:

function MyClass() {
  var private_var = 1; 
  function private_func()
  {

  }
  this.public_func = function() 
  {
     // do something
     private_func();
  }
  this.public_var = 10;
}

var myObj = new MyClass();

Обратной стороной этого подхода является то, что каждый раз, когда вы создаете объект с помощью «нового», вы заново создаете все закрытия. Но если мой профилировщик не скажет мне, что этот выбор дизайна должен быть оптимизирован, я предпочитаю его простоту и ясность.

Также я не вижу преимуществ в вашем коде от выполнения следующего:

  (function() { }).call(this);  // call the constructor

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

тогда я не вижу пользы в том, чтобы делать то, что делаете вы.

Что я обычно делаю (если мне нужно использовать «новый» для создания своего объекта), так это следующее:

function MyClass() {
  var private_var = 1; 
  function private_func()
  {

  }
  this.public_func = function() 
  {
     // do something
     private_func();
  }
  this.public_var = 10;
}

var myObj = new MyClass();

Обратной стороной этого подхода является то, что каждый раз, когда вы создаете объект с помощью «нового», вы заново создаете все закрытия. Но если мой профилировщик не скажет мне, что этот выбор дизайна должен быть оптимизирован, я предпочитаю его простоту и ясность.

Также я не вижу преимуществ в вашем коде от выполнения следующего:

  (function() { }).call(this);  // call the constructor

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

10
ответ дан 6 December 2019 в 07:52
поделиться

Мой ответ отрицательный: в JavaScript нет встроенного частного доступа, но это нормально, потому что YAGNI . Вот как я делаю закрытыми членами в моем коде:

function Some_Class() {
    this._private_member = 'whatever';
}

Some_Class.prototype._private_method = function() {
};

Этого достаточно. На самом деле не стоит прыгать через обручи, когда единственная реальная цель частного - защитить себя от ... самого себя.

(Я говорю это, потратив много часов на то, чтобы сам играть с каждой перестановкой закрытие и прототипирование, как и вы, и, наконец, говоря: «Да ладно, оно того не стоит».)

11
ответ дан 6 December 2019 в 07:52
поделиться

Если вы еще этого не сделали, ознакомьтесь с шаблоном модуля JavaScript , который позволяет вам получать доступ к частным методам и переменным из общедоступных функций и т. Д.

1
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: