Чтобы вернуть число, добавьте еще один слой скобок. Содержит это в чистоте.
var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
Использование переменных области видимости функций и замыканий для имитации частных переменных / функций - хорошо известная идиома в сообществе 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
Почему вы создаете отдельную область видимости в конструкторе?
Мой ответ отрицательный: в JavaScript нет встроенного частного
доступа, но это нормально, потому что YAGNI . Вот как я делаю закрытыми
членами в моем коде:
function Some_Class() {
this._private_member = 'whatever';
}
Some_Class.prototype._private_method = function() {
};
Этого достаточно. На самом деле не стоит прыгать через обручи, когда единственная реальная цель частного
- защитить себя от ... самого себя.
(Я говорю это, потратив много часов на то, чтобы сам играть с каждой перестановкой закрытие и прототипирование, как и вы, и, наконец, говоря: «Да ладно, оно того не стоит».)
Если вы еще этого не сделали, ознакомьтесь с шаблоном модуля JavaScript , который позволяет вам получать доступ к частным методам и переменным из общедоступных функций и т. Д.