Про Javascript Design Patterns опечатки?
Может ли кто-нибудь подтвердить, что эти образцы из главы 3 Pro Javascript Design Patterns имеют недостатки и, если да, то насколько они фундаментальны - они более чем опечатка или два от создания намеченной цели констант "класса" в JavaScript? Благодарю.
var Class = (function() {
// Constants (created as private static attributes).
var UPPER_BOUND = 100;
// Privileged static method.
this.getUPPER_BOUND() {//sic
return UPPER_BOUND;
}
...
// Return the constructor.
return function(constructorArgument) {
...
}
})();
/* Usage. */
Class.getUPPER_BOUND();
/* Grouping constants together. */
var Class = (function() {
// Private static attributes.
var constants = {
UPPER_BOUND: 100,
LOWER_BOUND: -100
}
// Privileged static method.
this.getConstant(name) {//sic
return constants[name];
}
...
// Return the constructor.
return function(constructorArgument) {
...
}
})();
/* Usage. */
Class.getConstant('UPPER_BOUND');
6 ответов
Код может быть тривиально исправлен как
var Class = {
UPPER_BOUND: 100
};
Остальная часть кода слишком спроектирована или явно неверна и должна игнорироваться.
Если вас интересует только чтение, установите для флага записи значение false (обратите внимание, что по умолчанию установлено значение false).
var Class = {};
Object.defineProperty(Class, "UPPER_BOUND", {
value: 100,
enumerable: true,
configurable: true
});
Я думаю, это неправильно. Как упоминалось ранее, "this" относится к объекту окна, и в коде также есть синтаксическая ошибка. Следующий код должен выполнить требуемую цель:
var Class = (function () {
// Private static attributes.
var constants = {
UPPER_BOUND: 100,
LOWER_BOUND: -100
};
var sc = function (constructorArgument) {
};
// Privileged static method.
sc.getConstant = function (name) {
return constants[name];
};
// Return the constructor.
return sc;
})();
alert(Class.getConstant('UPPER_BOUND'));
Проверьте это как хорошую альтернативу: http://www.klauskomenda.com/code/javascript-programming-patterns/
а для неизменяемых общедоступных свойств, как было предложено, используйте Object.freeze и замечательный совет Джона Резига: http://ejohn.org/blog/ecmascript-5-objects-and-properties/
и для того, чтобы не загромождать вашу глобальную область, добавьте пространства имен в jQuery: возможно ли создать пространство имен в jQuery?
Остерегайтесь всего, что претендует на звание "профи". Я не читал книгу, но мой код выглядит следующим образом:
> var Class = (function() {
>
> // Constants (created as private static attributes).
Слово "атрибуты" неверно, это должны быть либо "свойства", либо "переменные", потому что они являются переменными, которые также могут быть описаны как свойства локального объекта активации / переменной.
> var UPPER_BOUND = 100;
>
> // Privileged static method.
> this.getUPPER_BOUND() {//sic
Код будет выполнен в глобальном контексте, где this
это окно / глобальный объект. Поэтому, если есть глобальная функция *getUPPER_BOUND*, она будет вызываться без аргументов. За ним следует фигурная скобка ({), которая открывает блок в месте, где блок не может быть, так что это синтаксическая ошибка.
Я предполагаю, что было задумано следующее:
this.getUPPER_BOUND = function() {
который создает свойство getUPPER_BOUND для объекта global/window, которому присваивается анонимная функция в RHS при запуске кода.
> return UPPER_BOUND; }
>
> ...
>
> // Return the constructor.
> return function(constructorArgument) {
Эта функция назначена глобальной переменной "Класс".
> ...
> }
> })();
С исправлениями это может "работать", но не элегантно. Ни одна книга с такими явными ошибками в коде не была тщательно написана и, конечно, не была должным образом рассмотрена перед публикацией.
Используйте авторитетные онлайн-ресурсы и продолжайте задавать вопросы обо всем, что вы не понимаете или считаете ошибочным. Есть другие форумы для обсуждения javascript, которые могут предоставить гораздо более подробные ответы на технические вопросы.
Понял, что это работает, но не уверен, что это было то, что авторы хотели.
var Class = (function()
{
// Constants (created as private static attributes).
var constants =
{
UPPER_BOUND: 100,
LOWER_BOUND: -100
};
// Return the method(s).
return {
getConstant: function(name)
{
return constants[name];
}
}
}());
console.log(Class.getConstant('UPPER_BOUND')); // shows "100" in console
Как насчет этого?
/* Grouping constants together. */
var Class = (function() {
// Private static attributes.
var constants = {
UPPER_BOUND: 100,
LOWER_BOUND: -100
}
// Return the constructor.
return new function(constructorArgument) {
// Privileged static method.
this.getConstant = function(name) {//sic
return constants[name];
}
}
})();
console.log(Class.getConstant("LOWER_BOUND"));