Разница между MyClass.prototype = new Object () и MyClass.prototype = Object - PullRequest
11 голосов
/ 14 сентября 2009

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

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

и

MyClass.prototype = Object;

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

Ответы [ 3 ]

11 голосов
/ 14 сентября 2009

Ваши первые два примера полностью эквивалентны:

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

Ваш третий пример недопустим, поскольку вы присваиваете MyClass.prototype ссылку на конструктор Object , и это функция, а не новый объект.

Я лично предпочитаю второй, объект литерал или инициализатор синтаксис:

MyClass.prototype = {prop1: 'value', prop2: 'value2'};
//...
MyClass.prototype.foo = 'bar';
MyClass.prototype.method1: function () {/**/};

Редактировать: В ответ на ваш комментарий, пустой литерал объекта { } по существу эквивалентен new Object() из-за этого:

Production ObjectLiteral: {} есть оценивается следующим образом:

  1. Создайте новый объект как будто с помощью выражения new Object ().
  2. Результат возврата (1).

Подробнее см. В разделе 11.1.5 (Инициализатор объектов) спецификации языка ECMAScript (pdf).

Редактировать: Третий пример не будет выдавать никаких ошибок, но он совсем не годится, например, вы можете легко заглушить функцию конструктора Object, если потом расширете MyClass.prototype:

MyClass.prototype = Object;
MyClass.prototype.foo = 'bar';

Object.foo === MyClass.prototype.foo; // true
2 голосов
/ 14 сентября 2009

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

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

0 голосов
/ 10 августа 2010

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

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

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

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

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

var myObject = {myVar1: 10, myMethod1: function() { /* */};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...