Подтвердить что ты не робот

Разница между MyClass.prototype = new Object() и MyClass.prototype = Object

Может кто-нибудь скажет мне, где в Javascript разница между

MyClass.prototype = new Object(); //or ... = {}

и

MyClass.prototype = Object;

это? И если нет никакой разницы в результате, какой из них лучше всего подходит для практики?

4b9b3361

Ответ 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

Ответ 2

Это зависит от Object. Если это функция, вы хотите использовать метод new Object(). Если это "виртуальный класс" (определенный с помощью Object = {someProperty: someValue}), вы используете второй метод.

Еще несколько указателей в эта страница о наследовании прототипа в JavaScript

Ответ 3

MyClass.prototype.method1: function() {/**/};

Исправление к вышеперечисленному: оно должно быть

MyClass.prototype.method1 = function () {/**/}; 

(Обратите внимание на знак равенства после 'method1').

Двоеточие используется только тогда, когда определение метода само по себе находится в определении объекта, например:

var myObject = {myVar1: 10, myMethod1: function() { /* */};