Array, String, Number, Function, Object#DOM, prototypes functions - Расширяем возможности встроенных объектов.
** Enchants Version List
* Array: 1.1
* String: 1.02
* Number: 1.1
* Function: 1.01
* DOM: 1.0
* Class: John Resig
** JavaScript "Array" object functionnaly enchant library
* Includes:
* Bool Array().contains( Mixed needle [, String needle_key] );
* Bool Array().forEach( Function callback );
* Bool Array().every( Function callback );
* Bool Array().some( Function callback );
* Array Array().filter( Function callback );
* Array Array().map( Function callback );
* Bool Array().dumpKey( String key );
* String Array().dump( void );
* void Array().alert( void );
* Array Array().keyCase( [Boolean upperCase = false] );
* Array Array().chunk( Number size [, Boolean preserveKeys = false] );
* Array Array().combine( Array _array [, Boolean arrayKeys = false] );
* Array Array().countValues( void );
* Array Array().diff( Array _array [, Boolean strict = false] );
* Array Array().fill( [Number start = 0],[Number count = Start], Mixed val );
* Array Array().fillKeys( Array keys, Mixed val );
* Array Array().flip( void );
* Array Array().unique( void );
* Bool Array().keyExists( String key );
* String Array().search( Mixed needle );
* Self Array().empty( void );
*
*
** JavaScript "String" object functionnaly enchant library
* Includes:
* String String().addcslashes( String charlist );
* String String().addslashes( void );
* String String().bin2hex( [String separator = ''] );
* String String().dump( void );
* String String().ltrim( void );
* String String().rtrim( void );
* String String().trim( void );
* String String().random( [Number length = rand(1,64) [, String charlist = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"]] );
* Number String().hexToDec( [Boolean unsigned = false] );
*
*
** JavaScript "Number" object functionnaly enchant library
* Includes:
* Number Number().random( Number min_or_max [, Number max] );
* Number Number().module( void );
* Boolean Number().isNegative( void );
* Number Number().floor( void );
* Number Number().ceil( void );
* Number Number().round( void );
* Number Number().sqrt( void );
* Number Number().pow( Number expanent );
* Number Number().length( [Boolean negativeSymbolIncludes = false] );
* String Number().toHex( [Number length = 8] );
* String Number().float( Number length [, String type = round] );
* String Number().px();
*
*
** JavaScript "Function" object functionnaly enchant library
* Includes:
* Func Function().bind( [Mixed scope] );
* Func Function().checker( Array arguments_types [, Number arguments_min] );
*
* Changelog:
* [1.01]
* Syntax reformatted.
* [1.0]
* First release.
*
*
********************************************************************
* JavaScript "DOM" object functionnaly enchant library
* Includes:
* String Func CSS2JS( String name );
* Func ___EventListener( [Object DOM] element );
* Number [Object DOM].addEvent( String name, Callback proc );
* Number [Object DOM].remEvent( String name [, Number id] );
* Boolean document.ready( Mixed proc [, Mixed args [, Mixed scope]] );
* Mixed [Object DOMElement].css( Mixed cssNameData, Mixed cssData );
* Element [Object DOMElement].findById( String id );
* Element [Object DOMElement].findByClass( String className );
* Element [Object DOMElement].findByName( String name );
* Element [Object DOMElement].findByTagName( String tagName );
* Element [Object DOMElement].find( String query );
* Array [Object DOMElement].findAllByClass( String className );
* Array [Object DOMElement].findAllByTagName( String tagName );
* Array [Object DOMElement].findAll( String query );
*
*
** JavaScript "Class" constructor and inheritance
* Includes:
* Class Class.extend( Object classData );
* | __constructor - Class constructor;
* | __construct - Class initialization procedure.
* | _parent - Call method of parental class.
*
*
*/
|
Что такое
Array().alert
?это вызов метода alert(), для дампа массива, используется мной для отладки)
window.alert неявно вызывает метод toString у аргумента. toString у массива — это, фактически, Array.join(). Он по дефолту выдает вполне читабельное представление. Зачем вам этот метод-то?
Он выдает не совсем вполне читабельное представление, ввиду отсутствия рекурсии. И я собираюсь объединить всё это в одно, где дамп будет у всех объектов, включая DOM и классы. Так-что я считаю что это вполне оправданное действие.
Расширение функциональности стандартных объектов является моветоном
Не "является", а "некоторыми считается".
Если это является моветоном, то объясни что мне делать, старые браузеры не поддерживают метод bind у объекта Function, может мне теперь его не использовать для совместимости?
Записывание свойств в .prototype ни сколько не современней всех остальных способов. Бывают случаи, когда не следует соваться в прототипы объектов. В любом случае, любую операцию можно совершить без использования прототипов. Например jQuery не влезает не в один прототип объекта, хотя имеет функцию .bind к примеру. За счет этого - она по настоящему безконфликтная библиотека. Не следует соваться в прототип, без крайней необходимости.
P.S. Особенно насмешла фраза 'в ногу со временем'. Прототипы были даны классам с первой версии языка. Прописывание свойств в прототип грозит вам: плохой читаемостью, плохой ужинаеностью кода, медленностью инициализации, конфликты (например в javascript 1.4 появился метод .trim, а у массивов .forEach, их перезаписывание приведет к конфликтам или медленной работе самописной функции, по сравнению с нативной. ) Можно продолжить, но я думаю и этого хватает. Надеюсь теперь понятно, почему это моветон?
Сначала на код посмотри потом говори.
Во первых функции не перезаписоваются если они уже есть. во вторых я знаю что прототип с самого начала есть,но в старых браузерах нету forEach, И т.д., если их нету они добавляются.
И вообще, какого года эти функции. Они уже давно морально устарели. И причем тут Джон Резиг? Разве что это его старая работа. В его библиотеке jQuery функция trim выполнена совсем по другому. А эта вообще откровенно 'ламерски' написана, не будет работать в некоторых случаях, не корректно работает с не разрывными пробелами в ие, и медленнее аналогичной в jQuery в 2 раза. То же касается и остальных функций. Да уж, современные решения... Скорее старинный хлам.
Тест скорости для функции trim.
" Hello world!\t\t \t \r\n".trim();
725.8 ms
742.2 ms
700.4 ms
jQuery.trim(" Hello world!\t\t \t \r\n");
904.3 ms
867.0 ms
928.1 ms
Повтори что ты там сказал? Сначала докажите свою точку зрения, перед тем как писать её!
реализация Class Inheritance взята у John Resig. Ты бы читал перед тем как комментировать...
с каких пор ie некорректно интерпретирует регулярные выражения?
расширение Object.prototype - да, т.к. for..in теперь обязательно потребует hasOwnProperty, и забывание оного чревато багами.
А насчет других классов - спорно.
Кусок из JQuery, всегда так делают как RabiatoR сказал, свойства прототипа стандартных классов подменяются только если их там еще нет. Я думаю то у RabiatoR трим быстрее потому что одна замена а не две (читай replace вызывается 1 раз)
а про неразрывные пробелы I-zone прав, в ie6 надо [\s|\xA0]
Добавил удаление \xA0,
Провел тест скорости и получил:
757.3
733.4
734.1
Касательно двух замен вместо одной и вообще быстродействия трима и регулярок:
http://blog.stevenlevithan.com/archives/faster-trim-javascript
Учись проверять в разных браузерах. В опере вызов двух replace получается быстрее в win32, при длинной строке так же наблюдается выигрыш в firefox, одно 'или' в регэкспе притормаживает браузеры, у которых с логикой проблемы. Это не касается хрома и ие. Про проверку свойства имел ввиду частые ошибки, которые встречал в коде новичков. Всё, что можно реализовать в прототипе, можно реализовать и отдельными функциями, которые получаются куда более универсальными. Так же в jQuery trim не много медленнее, из за проверки на null и undefined, которые в вашей функции выкинут исключение. Часто строковые ключи, особенно в dom представленны объектом null. Ваш тест на одну строку фиксированной длины и под один браузер - не объективен. В своё время съел пуд соли с прототипами и функциями trim. В интернете, есть 6 функций trim, под разные случаи. Усредненные показатели лучше всего у двух replace, о чем например у Резига есть очень познавательная статья. Это показывают и мои тесты на трех разных машинах и со всеми браузерами. Не считайте всех глупцами на этом форуме, а изначально уважительно бы отнеслись к полезной информации для размышлений.
Если бы ты сразу так написал то отнесся бы уважительней, проверяю обычно в разных, времени небыло, но на 1 платформе 1 XP x86.
Проверка на null и undefined меня не интересует, пишу в первую очередь для себя, а не для общества.
"Каждый может написать свой js-фреймворк, но не каждый может удержаться от того, чтобы его использовать." (c) Subzey
стандартный Function.bind позволяет забиндить не только this, но и первые несколько аргументов