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

Можно ли назначить объект прототипа JavaScript вместо его свойств?

В JavaScript мы можем назначить свойства прототипу функции или напрямую установить его прототип:

var MyClass = function() { };

// The "property" form...
MyClass.prototype.foo = function() { ... };
MyClass.prototype.bar = function() { ... };
MyClass.prototype.gah = function() { ... };

// OR the "assignment" form...
MyClass.prototype = {
  foo:function() { ... },
  bar:function() { ... },
  gah:function() { ... }
};

Я лично предпочитаю форму назначения, потому что вы можете легко обернуть объект в закрытии (например, скрыть объекты "private"), а если позже вы решите изменить имя "MyClass", вам нужно найти только два места а не потенциально десятки. (Конечно, то же самое можно сказать и для формы "свойство", используя и вызывая функцию, которая принимает существующий прототип в качестве аргумента, но форма "присваивания" кажется более прямой, на мой взгляд.)

Есть ли веская причина использовать одну форму вместо другой?

[изменить]

Как отмечает комментатор @Raynos, вторая форма (присваивание) сжимает атрибут prototype.constructor, который должен быть установлен в функцию MyClass (и по умолчанию используется в первой форме [свойство]). Существуют ли какие-либо реальные недостатки (кроме того, что свойство не задано)?

4b9b3361

Ответ 1

Самая большая причина не использовать 2-ю форму, так это то, что вы закончите устранение всего, что было в прототипе, прежде чем назначать его. Если это не то, о чем вы беспокоитесь, нет причин не объявлять его так, как вы продемонстрировали.

Ответ 2

Я думаю, есть еще один недостаток использования формы "присваивания" для свойства prototype: вы, вероятно, уничтожите свойство prototype.__proto__ (цепочка прототипов), когда будете иметь дело с "псевдоклассическим" наследованием.

Конечно, можно утверждать, что есть устрашающий способ исправить это, а именно прикрепить свойство __proto__, чтобы снова подключить цепочку. Но забывая, что это приведет к нарушению кода, если вы вызываете родительский метод. Смотрите мою скрипку здесь: http://jsfiddle.net/glenn/v5Yub/

Заключение: форма "присваивания" может выглядеть проще/чище, но форма "свойство" безопаснее.