Если вы просто переведите свой Java-код в JavaScript, вы будете постоянно бороться с объектной моделью JavaScript, которая основана на прототипах, а не на классах.У объектов нет личных свойств, нет конечных свойств, если только вы не используете ES5-совместимый движок (вы не упомянули, какова ваша целевая среда выполнения; браузеры не используют ES5-совместимую,еще пару лет) вообще никаких классов .
Вместо этого я рекомендую вам подробно рассказать о том, как на самом деле работает ориентация объектов в JavaScript, а затем собрать свое приложениеполностью осознавая, как это делает JavaScript.Это нетривиально, но полезно.
Некоторые статьи, которые могут быть полезны.Я начинаю с замыканий, потому что для понимания JavaScript абсолютно необходимо понимание замыканий, а большинство решений для «закрытых членов» полагаются на замыкания.Затем я ссылаюсь на пару статей Дугласа Крокфорда.Крокфорд требуется читать, если вы собираетесь работать на JavaScript, даже если вы в конечном итоге не согласны с некоторыми из его выводов.Затем я указываю на пару статей, конкретно посвященных классическим вещам.
Обращаясь к некоторым вашим конкретным вопросам:
чтовы предлагаете сделать, чтобы создать свойства класса?Должен ли я использовать геттер / сеттеры?Мне не нравится делать это:
myObj.prop = "hello"
, потому что я мог бы использовать несуществующие свойства, и было бы легко что-то неправильно набрать ..
Нет, я предпочитаю использовать TDD , чтобы убедиться, что, если у меня есть опечатка, она обнаружится в тестировании.(Хороший редактор, завершающий код, также будет полезен здесь, хотя действительно хорошие редакторы, завершающие код JavaScript, невелики.) Но вы правы, что методы получения и установки в смысле Java (такие методы, какgetFoo
и setFoo
) сделает более очевидным, когда вы создаете / получаете доступ к свойству, которое вы не определили заранее (например, через опечатку), вызывая ошибку времени выполнения, вызываяфункция, которая не существует.(Я говорю «в смысле Java», потому что JavaScript с ES5 имеет различного рода «getters» и «setters» , которые прозрачны и не помогут с этим.) Так что это аргумент для использованияих.Если вы это сделаете, вы можете использовать компилятор Google Closure для сборок релизов, так как он будет встроен в них.
Как я могу сделать javascript немного похожим на java,с личным ...
Я связал статью Крокфорда о частных членах и мою собственную, в которой перечислены другие способы.Самое базовое объяснение модели Крокфорда таково: вы используете переменную в контексте, созданном с помощью вызова вашей функции конструктора, и функцию, созданную в этом контексте (замыкание), которая имеет к ней доступ, а не свойство объекта:
function Foo() {
var bar;
function Foo_setBar(b) {
bar = b;
}
function Foo_getBar() {
return bar;
}
this.setBar = Foo_setBar;
this.getBar = Foo_getBar;
}
bar
не является свойством объекта, но функции, определенные в контексте с ним, имеют постоянную ссылку на него. Это прекрасно, если у вас будет небольшое количество Foo
объектов. Если у вас будут тысячи Foo
объектов, которые вы, возможно, захотите пересмотреть, потому что каждый Foo
объект имеет свои две функции (действительно разные Function
экземпляра) для Foo_getBar
и Foo_setBar
.
Вы часто будете видеть выше написанное так:
function Foo() {
var bar;
this.setBar = function(b) {
bar = b;
};
this.getBar = function() {
return bar;
};
}
Да, это короче, но теперь функции не имеют имен, а присвоение имен вашим функциям помогает вашим инструментам .
Как я могу сделать javascript немного похожим на java, с ... public final properties
Вы можете определить получатель в стиле Java без установщика. Или, если ваша целевая среда будет соответствовать ES5 (опять же, браузеры еще нет, это будет еще через пару лет), вы можете использовать новую функцию Object.defineProperty
, которая позволяет вам устанавливать свойства это не может быть записано.
Но моя главная мысль - принять язык и среду, в которой вы работаете. Изучите это хорошо, и вы обнаружите, что применяются другие шаблоны, чем в Java. Оба - отличные языки (я часто их использую), но они работают по-разному и приводят к разным решениям.