2012-06-08 5 views
3

Я пытаюсь узнать Mootools, прочитав источник, и я не понимаю, почему это делает локальную копию функции:Mootools код объяснение

var Function = this.Function; 

, но почему он не делает локальную копию массива , Number и String, чтобы сделать то же самое, например, они сначала появляются, когда они непосредственно назначены, так почему же обрабатывать функцию по-другому?

Function.from = function(item){ 
    return (typeOf(item) == 'function') ? item : function(){ 
     return item; 
    }; 
}; 

Array.from = function(item){ 
    if (item == null) return []; 
    return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item]; 
}; 

Number.from = function(item){ 
    var number = parseFloat(item); 
    return isFinite(number) ? number : null; 
}; 

String.from = function(item){ 
    return item + ''; 
}; 

Также я не понимаю, как в строке 149 Функция вызывает функцию реализации, которая хранится в ее собственном свойстве прототипа?

Function.implement({ 

hide: function(){ 
    this.$hidden = true; 
    return this; 
}, 

protect: function(){ 
    this.$protected = true; 
    return this; 
} 

}); 

Это потому, что функция является функцией, поэтому ее внутренний [[прототип]] является Function.prototype?

+1

Что касается вашего обновления для строки 149, это потому, что 'реализация' находится на' Function.prototype', что автоматически делает его доступным для всех функций, которые имеют функцию Function.prototype в своей цепочке прототипов. Сюда входят функции конструктора, включая конструктор 'Function'. –

+0

Сделайте это ... 'Function.prototype === Object.getPrototypeOf (Function)', и вы увидите, что экземпляр 'Function' имеет свой собственный объект prototype в своей цепочке прототипов. Вы получите тот же результат для создаваемых функций ... 'Function.prototype === Object.getPrototypeOf (function() {})' http://es5.github.com/#x15.3.3 –

+2

hide/protect являются декораторами функций, которые используются классом - они позволяют методам стать «частными», поскольку все свойства функций в объекте конструктора класса «завернуты», и если защищенный флаг включен, он не позволит ему называться извне и т. д. эти декораторы не имеют никакого смысла вне самого класса. Проверьте типы 'MooTools' - например. https://github.com/mootools/mootools-core/blob/master/Source/Types/Function.js –

ответ

2
  • Вы заметите, что Function упоминается больше, чем другие конструкторы, так что это может быть, что они добавили локальную ссылку на крошечном прирост производительности, а также для сжатия, так как локальная переменная может быть запутанным. ... (С другого взгляд, я вижу больше ссылок на другие конструкторы, чем я первоначально имел.)

  • Вы также заметите, что .overloadSetter() прикован на функцию Function.prototype.extend оборачивает эту функцию с кучей дополнительный код, утиная печать и т. д. Поэтому причина, по которой они не использовали его, вероятно, заключалась в том, что этот дополнительный код, по-видимому, был нежелательным/ненужным для их внутреннего использования.

  • Поскольку implement расширяет прототип, это не всегда желательно. Иногда вам просто не нужны дополнительные методы для всех экземпляров, но вы хотите сохранить их в логическом пространстве имен, подобно встроенным методам, хранящимся в конструкторе Object.

+1

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

+1

Локальный 'var' внутри замыкания имеет смысл и часто используется как шаблон mootools. вы могли бы оптимизировать их намного лучше, но помните, что 'mootools-core' фактически состоит из почти 30 разных файлов и может быть« встроен »в спецификацию, включая только те части, которые вам нужны. большинство файлов имеют свои собственные блокировки (области).Это затрудняет макрооптимизацию переменных. он может иметь смысл в небольших закрываниях, особенно. в контексте критических характеристик, таких как анимация или конструкторы классов/декодеры методов и т. д., где могут встречаться повторные/циклические ссылки, выигрыш будет складываться. –

+1

http://jsperf.com/caching-into-local-scope - проверьте результаты. esp в chrome, огромные преимущества для кэширования на местном уровне. –

Смежные вопросы