2010-11-14 5 views
1

Видимо это идиома в JavaScript для реализации методов экземпляра класса, основанным на этом пути:функция MyClass() {...}; MyClass.prototype = MyClass; - считается вредным?

function MyClass(){...} 
MyClass.prototype.methodA = function(){...} 
MyClass.prototype.methodB = function(){...} 
... 

Почему люди не использующие эту компактнее форму вместо:

function MyClass(){...} 
MyClass.prototype = MyClass; 
MyClass.methodA = function(){...} 
MyClass.methodB = function(){...} 

Это, очевидно, не работает, если MyClass должен наследовать некоторый базовый класс (в этом случае обычно нужно установить прототип для нового экземпляра базового класса).

Однако в наши дни глубокие иерархии наследования становятся редкими (благодаря утиной печати и миксинам среди прочего).

Я что-то упустил?

MyClass.prototype = MyClass делает .constuctor более беспорядочным, чем он есть?

Неправильно ли это происходит с помощью typeof или instanceof или даже getPrototypeOf()?

Должно ли оно поощряться или считаться вредным?

ответ

1

Я думаю, что это бессмысленно, и это создает проблемы для потенциальных проблем, если один из ваших методов имеет имя, которое скрывает собственный метод из Function.prototype.

Вы всегда можете инициализировать прототип так:

function MyConstructor() { ... } 

MyConstructor.prototype = { 
    myMethod: function() { ... }, 
    whatever: null 
}; 

редактировать — если вам не нравится создавать константы объекта (и я должен сказать, что если вы собираетесь программировать на Javascript много, я полагаю, что вы пытаетесь привыкнуть к ним), вы можете просто сделать это:

MyConstructor.prototype = {}; 
MyConstructor.prototype.myMethod = function() { ... }; 

Я не люблю делать что много печатать, лично.

+0

Да, это то, что я раньше делал. Однако добавленный уровень отступов, «я», с которым я некоторое время перепутал, и тот факт, что я иногда интерпретирую функции интермедиации с аннотацией метапрограмм ... сделал меня неудобным с этим стилем (я вернулся к классической идиоматике .prototype, пока Я выясняю новое решение) – JeanHuguesRobert

+0

BTW: Я не понимаю «потенциальную проблему», о которой вы упоминаете, не могли бы вы рассказать об этом? Благодарю. – JeanHuguesRobert

+0

Класс Function в Javascript имеет кучу методов на собственном прототипе объекта. Если вы добавите методы и т. Д. К объекту функции, вы не сможете использовать их из этого экземпляра. Другими словами, если вы добавите метод «вызов» вашему прототипу, то ничего не сможет сделать «MyConstructor.call (...)» и получить ожидаемый результат. – Pointy

2

Может быть, потому что есть еще менее многословная форма?

MyClass.prototype = { 
    methodA: function(){}, 
    methodB: function(){} 
}; 

Это становится чище, тем больше методов у вас есть, кроме того, вы просто перекрывая прототип по умолчанию, и все, что было на нем.

+0

. Прототип по умолчанию: {} Я думаю, возможно, с неперечислимым свойством .constructor, указывающим на MyClass (I а не 100% этого, я никогда не использую его). До сих пор не большая потеря, если только не используется для этого, что я игнорирую, предложения? – JeanHuguesRobert

+0

Кроме того, JavaScript имеет «открытые классы», так сказать, можно добавить метод в любое время, вы не обязаны устанавливать их одновременно или из уникального исходного файла. – JeanHuguesRobert

+0

Является ли «еще менее многословная» форма менее сложной? Если я добавлю пробелы идентификаторов и разделитель, плюс}; terminator ... И при навигации по большим файлам я легко теряюсь, а не напоминаю, что такое класс, для которого я определяю метод. Читаемость требует некоторого уровня избыточности, когда многословие подразумевает уменьшение сигнала/шум. – JeanHuguesRobert