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 и классы. Так-что я считаю что это вполне оправданное действие.
console.dir?
Расширение функциональности стандартных объектов является моветоном
Не "является", а "некоторыми считается".
Если это является моветоном, то объясни что мне делать, старые браузеры не поддерживают метод bind у объекта Function, может мне теперь его не использовать для совместимости?
call, apply
Т.е. вы предлагаете не использовать новые возможности javascript.
Тогда может быть вы откроете протест против обновления функциональности данного языка? Вас пугает что-то новое? почему моветон!, раз реализовали прототип то хотели чтоб его использовали, если вам он не нравится то не используйте, я же предпочитаю не отрываться от развития новых технологий а идти в ногу со временем, даже если это предполагает написание функций прототипа для поддержки совместимости.
Записывание свойств в .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, но и первые несколько аргументов
Brazylijska pupa roksa
Roksa i podobne strony
Anonse erotyczne vip
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.