Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.05.2015, 17:23
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Как сделан Array.forEach() ?
Пытался найти текст кода, где реализован Array.forEach()

http://docs.sencha.com/extjs/5.1/5.1...method-forEach

И не нашел. Они как-то сделали, что в для каждого массива доступны дополнительные методы. Хочу посмотреть как они это реализовали. Мне нужно туда добавить парочку, только для класса Number.
Ответить с цитированием
  #2 (permalink)  
Старый 22.05.2015, 17:45
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

http://docs.sencha.com/extjs/5.1/5.1...ay-method-each

про нативный Array нужно поискать...

forEach: ('forEach' in arrayPrototype) ? function(array, fn, scope) {
                return array.forEach(fn, scope);
            } : function(array, fn, scope) {
                for (var i = 0,
                    ln = array.length; i < ln; i++) {
                    fn.call(scope, array[i], i, array);
                }
            },

Последний раз редактировалось novikov, 22.05.2015 в 17:49.
Ответить с цитированием
  #3 (permalink)  
Старый 22.05.2015, 17:46
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Попробовал вот так, вроде работает. Но помнится был неудачный опыт, хотелось бы посмотреть как это делают профи.

Ext.define("MyNumber", {
		
		override: "Number",
		
		unit: null,
		
		setUnit: function(unit) {
			this.unit = unit;
			return this;
		},
		
		getUnit: function() {
			return this.unit;
		},
		
		toString: function(withUnit) {
			return withUnit ? String(this) + " " + this.unit : this;
		}
		
	});
	
	
	console.log((5).setUnit("мм").toString(true));
Ответить с цитированием
  #4 (permalink)  
Старый 22.05.2015, 18:49
Профессор
Отправить личное сообщение для novikov Посмотреть профиль Найти все сообщения от novikov
 
Регистрация: 19.11.2012
Сообщений: 178

Изменять прототипы нативных объектов чревато конфликтами библиотек, поэтому я думаю, что Сенча не меняли ничего, а просто добавили в документацию описание того, что есть в JS, для полноты картины и чтобы знать свой набор инструментов. Может, метод forEach есть во всех поддерживаемых браузерах? Могу ошибаться.

Ну и у нативного объекта нельзя найти метод callParent. Ext.define на этом ломается, предположительно.
Ответить с цитированием
  #5 (permalink)  
Старый 22.05.2015, 20:11
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Я считал что операция Ext.override как раз и добавляет метод callParent...

По поводу того, что forEach штатная функция JS я не подумал. Надо проверить это дело... у меня чето застарелый мануал по JS тогда.
Ответить с цитированием
  #6 (permalink)  
Старый 22.05.2015, 21:20
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

Array.forEach() это нативный метод в IE9+ и прочих ES 5.1 совместимых браузерах. Ext JS не добавляет polyfill в IE8, а вместо этого предоставляет отдельный объект Ext.Array, в котором forEach либо проваливается в нативный, если такой метод есть, или выполняется нашим кодом. Своего рода polyfill, но без мусора в нативных прототипах.

Ext.define({ override: … }) работает только на классах, которые наследуются от Ext.Base. Любой класс, заданный с помощью Ext.define(), наследуется от Ext.Base, но нативные объекты конечно же такого наследования не имеют, поэтому сделать override нативного объекта не получится.
Ответить с цитированием
  #7 (permalink)  
Старый 23.05.2015, 00:15
Аватар для khusamov
Соединяю Node.js и Ext JS
Отправить личное сообщение для khusamov Посмотреть профиль Найти все сообщения от khusamov
 
Регистрация: 25.06.2009
Сообщений: 1,033

Спасибо про Ext.Base, понял откуда берется метод callParent()...

Правда пока сам оверрайд работает, как ни странно. Разве что придется обходится без callParent...
Ответить с цитированием
  #8 (permalink)  
Старый 23.05.2015, 00:35
Аватар для nohuhu
Профессор
Отправить личное сообщение для nohuhu Посмотреть профиль Найти все сообщения от nohuhu
 
Регистрация: 21.05.2015
Сообщений: 321

"Работает" это растяжимое понятие. Ext.override(), или Ext.define({ override: … }) "просто" заменит старые свойства объекта на новые, точно так же, если их руками присвоить. Но будет ли это работать так, как вы ожидаете? Зависит от ожиданий. ;)

Вот вы пример хороший сами же привели, что callParent() работать не будет. Так и не будет, откуда ссылке на суперкласс взяться в нативном объекте?

И таки да, ничего особенно волшебного в классовой системе Ext JS нету. Берём объекты JavaScript, шаманим с прототипами и вуаля. Просто если делать всё это каждый раз руками, то руки быстро отвалятся.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать что бы картинки с другого url отображались как свои zlodey Серверные языки и технологии 1 04.05.2015 21:30
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Как писать код который легко поддерживать, расширять, читать. Policeman Общие вопросы Javascript 3 24.03.2012 05:40
Как при быстром многократном клике по кнопке обрабатывать только первый клик battrack jQuery 3 22.03.2012 10:47
Как отловить обратное событие "click" ? jsuse Общие вопросы Javascript 2 18.01.2012 00:16