Когда я захочу использовать «классовые» (статические) методы или свойства в JavaScript? - PullRequest
6 голосов
/ 29 июня 2011

Почему в JavaScript нужно прикреплять свойства непосредственно к конструктору?

var Human = function() {};
Human.specie = "Homo Sapience";

У меня возник этот вопрос после просмотра вспомогательной функции CoffeeScript __extend, которая среди строк содержит:

for ( var key in parent ) { 
  if ( __hasProp.call( parent, key ) ) child[key] = parent[key]; 
} 

, которая копирует свойства / методы в подклассный объектпрямо из конструктора объекта.Но зачем кому-то это делать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

( Редактировать: В первоначальном виде задавался вопрос о том, как присоединять свойства к классам, а не прикреплять их к прототипам, поэтому я отвечаю.)

Это действительноболее условным, чем все остальное.Если вы напишите

Human::specie = "Homo sapiens"

(где Human::specie - сокращение от CoffeeScript для Human.prototype.specie), то объявите jane = new Human, тогда jane.specie будет "Homo sapiens" (если вы специально не установите для jane.specieеще).В этом случае это звучит желательно.

Но в других случаях наличие свойства, общего для большого количества прототипов, затрудняет понимание вашего кода.Допустим, у вас есть класс Logger с объектом config.Если вы прикрепите этот объект к прототипу, то вы могли бы написать код, подобный следующему:

log = new Logger
log.config.destination = './foo'

Это изменит назначение всех Logger экземпляров на './foo', потому что естьтолько один config объект.Если вы хотите, чтобы config применялся ко всем Logger экземплярам, ​​вы должны присоединить его к собственному классу, удалив двусмысленность из кода выше:

log = new Logger
Logger.config.destination = './foo'
1 голос
/ 29 июня 2011

В игре говорят, что у вас есть объект под названием мир.Однако в игре будет только один мир.Это теоретически причина, по которой вы бы это сделали.

0 голосов
/ 25 октября 2011

Короче, ответ на поставленный вопрос: интервал между именами .Существуют определенные значения, которые могут иметь смысл совместно использовать в вашей программе и которые семантически связаны с определенным классом.Эти функции и значения могут быть просто помещены в некоторые переменные, но присоединение их к функции конструктора целесообразно для их пространства имен.

Лучший пример - класс JavaScript Math (для пуристов я знаю, что это не совсемкласс, это объект):

// There are constants
Math.E
Math.PI
Math.SQRT2
// And there are also methods
Math.ceil
Math.cos
Math.sin

Таким образом, методы и значения (сохраненные в константах) всегда одинаковы и не зависят от экземпляра, к которому они обращаются, и это не имеет смыслаиметь их в случаях.

...