Ответ 1
Ваши первые два примера полностью эквивалентны:
MyClass.prototype = new Object(); // empty object
MyClass.prototype = {}; // empty object
Ваш третий пример недействителен, поскольку вы присваиваете MyClass.prototype
ссылку на конструктор Object, и это функция, а не новый объект.
Я лично предпочитаю второй, объект literal или инициализатор:
MyClass.prototype = {prop1: 'value', prop2: 'value2'};
//...
MyClass.prototype.foo = 'bar';
MyClass.prototype.method1: function () {/**/};
Изменить: В ответ на ваш комментарий пустой литерал объекта { }
по существу эквивалентен new Object()
из-за этого:
Производственный объектLiteral: {} является оценивается следующим образом:
- Создайте новый объект, как если бы с помощью выражения new Object().
- Результат возврата (1).
Подробнее см. раздел 11.1.5 (Инициализатор объектов) Спецификация языка ECMAScript (pdf).
Изменить:. Третий пример не приведет к ошибкам, но не совсем хорош, например, вы можете легко скрыть функцию конструктора объектов, если впоследствии вы откроете MyClass.prototype:
MyClass.prototype = Object;
MyClass.prototype.foo = 'bar';
Object.foo === MyClass.prototype.foo; // true