Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #71 (permalink)  
Старый 22.04.2011, 16:31
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Sweet, прости, я норм к тебе отношусь.
Сообщение от Sweet
И вообще, твой пример никак не связан с циклом for..in!
Ок, вот другой пример, когда есть дефолтные значения:
var defaultOptions = {};
function Constructor(options){
  for(var property in defaultOptions){
    if(defaultOptions.hasOwnProperty(property)){ // Проверяем только нужные свойства. Вот здесь hasOwnProperty обязательно.
      // Делаем нужные действия
    }
  }
}


Когда нет дефолтных значений, проверять нужно так:
function Constructor(options){
  // Допустим, нам нужно проверить конкретное свойство
  // Если тип не важен:
  if('prop' in options){}
  // Если важен:
  if('prop' in options && (/* тут проверка типа */)){} // prop in obj - тоже обязательно
}


Но никак не hasOwnProperty! Его нужно использовать только для "своих" объектов и то, если они не имеют кастомных прототипов.
Из этого видно, что значением может оказаться ваше кастомное свойство из прототипа.

Сообщение от Kolyaj
тебя спрашивают, почему плохо расширять Function.prototype, а ты объясняешь, почему плохо расширять Object.prototype. Так в Object.prototype никто и не лезет.
Откуда ты можешь знать, из какого прототипа берутся значения? Если объект приходит извне и тебе нужны только значения свойств, нельзя смотреть на тип объекта. В примерах выше я могу в options передать и функцию, если мне будет так удобно.

Что я этим хотел сказать:
Если везде применять hasOwnProperty и проверять тип объекта - создаются ограничения, в частности, нельзя уже использовать наследование. Если расширять прототипы нативных конструкторов - они начинают везде обрабатываться, что может привести назад к использованию hasOwnProperty или даже к багу. Замкнутый круг. В каком месте его разрывать - каждый решает сам для себя, о чем я писал выше. Все полюсы и минусы я показал.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф

Последний раз редактировалось B~Vladi, 22.04.2011 в 16:38.
Ответить с цитированием
  #72 (permalink)  
Старый 22.04.2011, 17:19
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Насколько я понял, это выглядет примерно так:
function SomeConstructor( object ){
  this.property1 = object.property1 || 'default';
  this.property2 = object.property2 || 'default';
};

var func = function(){};
func.property1 = 'value';

Function.prototype.property2 = 'zapadlo';

new SomeConstructor( func ); // Тысяча чертей, почему property2 не 'default'???
Но для себя я решил, что имею полное право дополнять нативные конструкторы там, где считаю нужным. Что плохого в том, что я, например, добавляю в Array.prototype методы forEach, filter и пр.? Я, конечно, понимаю про for..in, но мы же знаем, как зовут тех, кто так переберает массивы?
Ответить с цитированием
  #73 (permalink)  
Старый 22.04.2011, 17:49
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Расширение Array.prototype, Function.prototype и т.д. менее опасно только из-за того, что их экземпляры используются в основном по назначению, а не для хранения/передачи свойств. forEach и filter это, конечно же, хорошо, но только потому что они есть в спецификации и в реализациях, поэтому безопасно.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #74 (permalink)  
Старый 23.04.2011, 06:09
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Вот как-то так получилось:
Function.prototype.callAsync = function() {
	var self = this, args = $A(arguments), thisObj = args.shift(), elem = document.createElement('div'), done = false;
	elem.onclick = function() {
		if (!done) {
			done = true;
			self.apply(thisObj, args);
		}
	};
	if (document.createEvent) {
		var e = document.createEvent('HTMLEvents');
		e.initEvent('click', false, false);
		elem.dispatchEvent(e);
	} else document.createDocumentFragment().appendChild(elem).fireEvent('onclick', document.createEventObject());
	if (!done) setTimeout(elem.onclick, 15);
};

var $A = function(iterable) {
	if (iterable) {
		var result = [], i = iterable.length;
		while (i) result[--i] = iterable[i];
		return result;
	}
	return [];
};

var testFunc = function() {
	alert('testFunc');
	throw new Error('testFunc');
};

testFunc.method();
alert('global');
testFunc.method();
alert('global');

Последний раз редактировалось Riim, 24.04.2011 в 16:16.
Ответить с цитированием
  #75 (permalink)  
Старый 23.04.2011, 10:52
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от B~Vladi
forEach и filter это, конечно же, хорошо, но только потому что они есть в спецификации и в реализациях, поэтому безопасно.
Почему безопасно? Они же тоже будут попадать в for-in.
Ответить с цитированием
  #76 (permalink)  
Старый 23.04.2011, 11:30
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Kolyaj
Они же тоже будут попадать в for-in.
Ну да, не совсем уж так и безопасно.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #77 (permalink)  
Старый 23.04.2011, 11:35
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Но при этом мы знаем, что не надо перебирать массивы с помощью for-in, поэтому не боимся дописывать forEach/map/filter/... .
Ответить с цитированием
  #78 (permalink)  
Старый 28.04.2011, 07:49
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

B~Vladi, ты прав, если неадекватные пользователи входят в целевую аудиторию решения (jquery way?), но все может быть проще

ссылка по смежной теме: What’s wrong with extending the DOM
Ответить с цитированием
  #79 (permalink)  
Старый 28.04.2011, 21:02
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

https://github.com/sstephenson/proto...object.js#L112
+
https://developer.mozilla.org/en/JSON#section_12
=
epic fail
__________________
.ня
Ответить с цитированием
  #80 (permalink)  
Старый 28.04.2011, 22:43
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

намекаешь на дефолтную реализацию исполнения ф-й в отдельных потоках?
Ответить с цитированием
Ответ



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

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