И теперь что? Несомненно, существует хорошее ООП способ сделать это:
str.request (это);
Слишком плохой, что Строка не может быть расширена и теперь Вы рассматриваете запись класса HttpInstruction с 8 подклассами для каждого HttpInstruction. Честно, особенно при разговоре о синтаксических анализаторах, это просто существенно трудно.
Когда-нибудь попытка методы расширения C#? Строка может быть расширена.
На самом деле все дело в семантике. Если вы разбиваете свой код на несколько файлов и планируете использовать общее пространство имен, то сделать что-то вроде этого будет немного проще:
Это хорошо, но лучше объявлять частные переменные как локальные в пространстве имен вместо использования одного объекта priv. Преимущества: меньше кода, упаковщик может сжимать имена переменных. Попробуйте упаковать свой код здесь: http://dean.edwards.name/packer/
Я думаю, что ваш пример прекрасен, и весь этот вопрос в основном касается вкуса. Однако я бы написал это так:
var NAMESPACE = {
publicVar1: '',
publicFunction1: (function(){
var privateVar1 = '';
var privateVar2 = '';
function privateFunction1 () {
//do stuff
//[...]
};
return function(){
//do stuff with private functions and variables
priv.privateVar1 = priv.privateFunction1(pub.publicVar1);
}
})()
}
Прежде всего, пространство имен должно быть верхним регистром, как предлагает Дуглас Крокфорд и как его видит YAHOO.
Во-вторых, я создаю NAMESPACE с его свойствами напрямую, а не через анонимный функция. Но я создал функцию publicFunction1 в анонимной функции, поэтому я могу определять в ней частные функции и переменные. Это немного отличается, потому что объем даже меньше, чем в вашем примере. Преимущество в том, что другие функции в том же пространстве имен могут использовать те же имена переменных. Недостатком является то, что другая функция не использует те же переменные, что и эта функция: -)