Первый - это функция, второй - литерал объекта.Поскольку функции в JS являются объектами первого класса, функция может иметь свойства, как и любой другой объект.
Как правило, если вы хотите создать «класс», с которым вы, возможно, знакомы по классическому наследованиюязыки, вы должны сделать что-то вроде
function MyClass() {...}
, как описано здесь http://www.crockford.com/javascript/inheritance.html
Чтобы ответить на вопрос, заданный в ваших изменениях, вы должны использовать их оба в разных ситуациях.Объектные литералы используются для передачи конфигураций.Типичным шаблоном использования может быть метод, который принимает литерал объекта, например,
something.init({
length: 10,
height: 10,
text: 'some text'
});
и так далее.
Вы можете использовать что-то похожее на ваш первый пример при создании пространства имен.В Javascript есть несколько интересных языковых особенностей: у вас могут быть так называемые «самопризывающие функции», которые имеют вид:
var myApp = (function(){
var firstMethod = function() {...}
...
})();
мотивы, стоящие за чем-то подобным, подробно описаны здесь
http://sparecycles.wordpress.com/2008/06/29/advanced-javascript/
Вы также можете исследовать различия с помощью вашей любимой консоли отладки JavaScript.В Firebug и Chrome я сделал следующее:
var ol = {};ol.prototype;
var fn = function () {};fn.prototype;
первая строка печатает неопределенное значение, вторая возвращает прототип с конструктором 'function'