Вообще, автор статьи не до конца разобрался в теме.
Основная ошибка и "затык" начинающих попытка обращаться с прототипами объектов, а не их конструкторов. Ибо прототипов у самих объектов нет.
// конструктор
var MyObj = function(){ this.x = 10; };
MyObj.prototype = { x:0, y:0, move:function(x,y){this.x=x; this.y=y;} };
// создание объекта
var myObj = new MyObj();
for(var i in myObj){ if myObj.hasOwnProperty(i) alert(i); } // -> «x»
alert(myObj.x); // -> 10
alert(myObj.y); // -> 0
alert(myObj.move); // -> «function», т.е. метод присутствует.
Как это работает:
«MyObj» обычная функция. Ещё раз: обычная функция.
При вызове (любой) функции с оператором new происходят три вещи:
1. Создаётся новый, «чистый» объект в памяти.
2. Ссылка на него передаётся вызываемой функции как «this». Всё, что функция назначит этому «this» внутри себя, соответственно будет назначено новому объекту.
3. По окончании работы ссылка на объект возвращается переменной по оператору присваивания. В нашем примере – «myObj». Также мы можем вернуть ссылку явно – оператором «return».
Если проверить все «собственные» свойства свежесозданного «myObj» при помощи метода hasOwnProperty() выяснится, что он имеет лишь свойство «x», назначенное ему конструктором.
for(var i in myObj){ if myObj.hasOwnProperty(i) alert(i); } // -> «x»
Тогда откуда берётся «y»? Не найдя этого свойства в самом объекте, машинка обращается к создавшей его функции. Ссылка на неё хранится в каждом объекте, в свойстве «constructor» (мы даже можем проверять принадлежность объекта: myObj.constructor == MyObj // -> true). Затем машинка обращается с свойству «prototype» конструктора и – о чудо – находит там «y». Полный путь: «myObj.constructor.prototype.y». Надеюсь, не нужно объяснять, почему это свойство получается общим для всех объектов, созданных через MyObj().
Вообще, все «общие» свойства, такие как методы или «статические» переменные нужно оставлять в прототипах. Делать на них лишние ссылки из объектов не нужно – машинка сама найдёт свойство по цепочке наследования. Другое дело, что можно переопределить свойство (как это сделано с «x» в примере) – тогда его значение будет уникальным, принадлежащим только этому объекту, а машинка доберётся до него раньше, не углубляясь в прототипы.
Подробнее о самом «прототипе». Это обычный объект, с обычными свойствами, создается обычным путём (запись в примере «someObj = {}» является лишь сокращением от «someObj = new Object()», как и «someObj = []» является «someObj = new Array()»). Т.е. можно создавать объект-прототип любого класса. Так реализуется наследование.
// новый конструктор
var myObj2 = function(){};
MyObj2.prototype = new MyObj(); // ога, вот отсюда возьмём всё что не найдем в самих объектах
// его объект
var myObj2 = new MyObj2();
for(var i in myObj2){ if myObj2.hasOwnProperty(i) alert(i); } // а ничего нет – кунструктор-то ничего не назначил, объект пустой
7-8 линков вы это про линк-фермы что-ли?
Они, вместе со сквоттерами отдельный вопрос, от числа доменов не зависящий.
Проблемы, да, решать нужно. Согласен, что нацдомены решают, разве что, проблему получения прибыли регистраторами.
Скорее всего, более-менее крупные владельцы нацадреса будут использовать лишь как синонимы (а регистраторы, понятное дело, как "лишний" заработок ИМХО, для того и придумано).
Ключевое словосочетание "все разработчики". Конечно, это из области фантастики и моральная сторона темна, но клин клином вышибают + помечтать захотелось :)
А "медленно, без резких проблем" должно начинаться хотя бы с информирования о том, что IE, вообще-то, не часть ОС и его можно заменять. Об етом и жужжу.
А это мысль. Если бы все разработчики пользовались методами MS и вместо добросовестных раскоряк и врапперов писали бы, что "Данная функция не поддерживается этим браузером, взять правильный можно здесь...", может быть что-то и поменялось бы :)
Коробка, всё правильно. Но я понимаю, когда "коробочный" браузер поставляется в системе, например, как минимальное средство получить нормальный браузер. Но когда это убожество всеми силами даёт понять, что вот оно и есть нормально я понимаю это с трудом.
Самый первый мой пост был как раз об этом.
Это как раз основной вопрос. Подозреваю, что при такой интеграции простые пользователи вообще считают IE и Windows одним целым даже предположения не возникает, что можно иметь другой браузер. MS в своём амплуа, короче.
Несоответствие стандартам опустим, грешки за всеми.
Остаются лишь тупость (слабый инструментарий для разработчика, медленное развитие), баги (иногда очень трудноуловимые), монополистическая политика (чего, например, стоит закрытие Elements в DOM). Всё вместе выливается в лишнюю тупую работу, за которую (!) ещё и платить приходится, нервными клетками в том числе. Если IE Вас ни разу не удручал, Вы или адепт дзен, или просто мало с ним общались.
Когда кто-нибудь в отношении IE того же добьётся? Хотя бы пункта "Microsoft будет также информировать пользователей компьютеров, как они могут изменить установленный по умолчанию браузер".
Он же реально мешает разрабатывать сайты.
Капча по фото: http://pictcha.net/
Картинки деформируются геометрически и по цвету. Настройки количества вывода, кеш, все дела.
Сто лет назад делал, да руки не дошли проверить. Но теоретическая сложность лома интересует.
Полезна команда "Bookmark all tabs".
Но мало кто знает, что для восстановления сразу всех закладок из папки, можно щелкнуть по ней средней кнопкой мыши.
Вообще, автор статьи не до конца разобрался в теме.
Основная ошибка и "затык" начинающих попытка обращаться с прототипами объектов, а не их конструкторов. Ибо прототипов у самих объектов нет.
// конструктор
var MyObj = function(){ this.x = 10; };
MyObj.prototype = { x:0, y:0, move:function(x,y){this.x=x; this.y=y;} };
// создание объекта
var myObj = new MyObj();
for(var i in myObj){ if myObj.hasOwnProperty(i) alert(i); } // -> «x»
alert(myObj.x); // -> 10
alert(myObj.y); // -> 0
alert(myObj.move); // -> «function», т.е. метод присутствует.
Как это работает:
«MyObj» обычная функция. Ещё раз: обычная функция.
При вызове (любой) функции с оператором new происходят три вещи:
1. Создаётся новый, «чистый» объект в памяти.
2. Ссылка на него передаётся вызываемой функции как «this». Всё, что функция назначит этому «this» внутри себя, соответственно будет назначено новому объекту.
3. По окончании работы ссылка на объект возвращается переменной по оператору присваивания. В нашем примере – «myObj». Также мы можем вернуть ссылку явно – оператором «return».
Если проверить все «собственные» свойства свежесозданного «myObj» при помощи метода hasOwnProperty() выяснится, что он имеет лишь свойство «x», назначенное ему конструктором.
for(var i in myObj){ if myObj.hasOwnProperty(i) alert(i); } // -> «x»
Тогда откуда берётся «y»? Не найдя этого свойства в самом объекте, машинка обращается к создавшей его функции. Ссылка на неё хранится в каждом объекте, в свойстве «constructor» (мы даже можем проверять принадлежность объекта: myObj.constructor == MyObj // -> true). Затем машинка обращается с свойству «prototype» конструктора и – о чудо – находит там «y». Полный путь: «myObj.constructor.prototype.y». Надеюсь, не нужно объяснять, почему это свойство получается общим для всех объектов, созданных через MyObj().
Вообще, все «общие» свойства, такие как методы или «статические» переменные нужно оставлять в прототипах. Делать на них лишние ссылки из объектов не нужно – машинка сама найдёт свойство по цепочке наследования. Другое дело, что можно переопределить свойство (как это сделано с «x» в примере) – тогда его значение будет уникальным, принадлежащим только этому объекту, а машинка доберётся до него раньше, не углубляясь в прототипы.
Подробнее о самом «прототипе». Это обычный объект, с обычными свойствами, создается обычным путём (запись в примере «someObj = {}» является лишь сокращением от «someObj = new Object()», как и «someObj = []» является «someObj = new Array()»). Т.е. можно создавать объект-прототип любого класса. Так реализуется наследование.
// новый конструктор
var myObj2 = function(){};
MyObj2.prototype = new MyObj(); // ога, вот отсюда возьмём всё что не найдем в самих объектах
// его объект
var myObj2 = new MyObj2();
for(var i in myObj2){ if myObj2.hasOwnProperty(i) alert(i); } // а ничего нет – кунструктор-то ничего не назначил, объект пустой
Они, вместе со сквоттерами отдельный вопрос, от числа доменов не зависящий.
Проблемы, да, решать нужно. Согласен, что нацдомены решают, разве что, проблему получения прибыли регистраторами.
2. Не пользуюсь MacOS.
Ссылка мне не дается, простите.
То, что вам никто не говорил о многозадачности в Windows
А "медленно, без резких проблем" должно начинаться хотя бы с информирования о том, что IE, вообще-то, не часть ОС и его можно заменять. Об етом и жужжу.
Самый первый мой пост был как раз об этом.
Остаются лишь тупость (слабый инструментарий для разработчика, медленное развитие), баги (иногда очень трудноуловимые), монополистическая политика (чего, например, стоит закрытие Elements в DOM). Всё вместе выливается в лишнюю тупую работу, за которую (!) ещё и платить приходится, нервными клетками в том числе. Если IE Вас ни разу не удручал, Вы или адепт дзен, или просто мало с ним общались.
Он же реально мешает разрабатывать сайты.
Или что-то другое имеется в виду?
Картинки деформируются геометрически и по цвету. Настройки количества вывода, кеш, все дела.
Сто лет назад делал, да руки не дошли проверить. Но теоретическая сложность лома интересует.
Но мало кто знает, что для восстановления сразу всех закладок из папки, можно щелкнуть по ней средней кнопкой мыши.