Можно ли назначить объект прототипа 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 (и по умолчанию используется в первой форме [свойство]). Существуют ли какие-либо реальные недостатки (кроме того, что свойство не задано)?
Ответы
Ответ 1
Самая большая причина не использовать 2-ю форму, так это то, что вы закончите устранение всего, что было в прототипе, прежде чем назначать его. Если это не то, о чем вы беспокоитесь, нет причин не объявлять его так, как вы продемонстрировали.
Ответ 2
Я думаю, есть еще один недостаток использования формы "присваивания" для свойства prototype
: вы, вероятно, уничтожите свойство prototype.__proto__
(цепочка прототипов), когда будете иметь дело с "псевдоклассическим" наследованием.
Конечно, можно утверждать, что есть устрашающий способ исправить это, а именно прикрепить свойство __proto__
, чтобы снова подключить цепочку. Но забывая, что это приведет к нарушению кода, если вы вызываете родительский метод. Смотрите мою скрипку здесь: http://jsfiddle.net/glenn/v5Yub/
Заключение: форма "присваивания" может выглядеть проще/чище, но форма "свойство" безопаснее.