> обьявление в прототипе разделит свойство для всех экземпляров.
Ну, это можно считать разновидностью static-а — свойство одно на все экземпляры.
> обьявление в конструкторе и есть замыкание
В смысле, объявление свойством функции? Нет, это не замыкание, это обычное свойство функции.
> которое живет не зависимо от конструктора после создания экземпляра
Замыкание может жить не зависимо от жизни порождаемого контекста. А экземпляр-то тут при чём? Конструктор порождает экземпляры, экземпляры имеют связь с конструктором через [[Prototype]].constructor. Объявляя свойство в конструкторе, это то же самое, что [[Prototype]].constructor.нашеСвойство; и с этой точки зрения, появляется лишь лишнее промежуточное свойство .constructor, чтобы достучаться до .нашеСвойство (если было бы в прототипе, — [[Prototype]].нашеСвойство). Однако, если объекты сами будут иметь такое свойство, то протоип уже не подойдёт, т.к. будет сразу найдено родное свойство.
> И область видимости — только данный экземпляр.
Какой данный эземпляр? Объявляя свойство в конструкторе — вы просто объявляется свойство в конструкторе, независимом объекте. Порождаемые конструктором объекты, после порождения уже могут быть не связаны с конструктором. Поэтому, в качестве этого хранилища может абсолютно любой объект, но конструктор — да, наиболее подходящий (по смыслу). Хранение в прототипе привёл в качестве альтернативы (хотя, здесь расшаривается только на чтение, после первой записи, объекты будет уже иметь своё такое свойство).
А какова цель? Если нужно разделяемое между всем объектами свойство, то можно и прототип зайдествовать (это одна из его сущностей). Можно и в конструкторе хранить, только по идее, объект, после того, как был порождён, может уже не иметь связи с конструктором — конструктор может издохнуть, и это не отобразиться на объекте и его прототипе.
Да нет, это верно безотносительно реализаций стандарта (почитайте на досуге (даже на русский перевели); если интересно, могу также предложить ряд моих статей по углублённому Javascript-у — там не так сухо, как в стандарте). IE тут не при чём. То, что IE маппит id-шники DOM-элементов в глобальный объект — это вообще с Javascript-ом не связано.
Почитайте по ссылке в предыдущем моем посте. Объявление без var — создаёт лишь свойство глобального объекта (в DOM-моделе, свойство window глобального объекта ссылается на сам глобальный обеъект). То, что переменные, объявленные в глобальном контексте и обычные свойства глобального объекта попадают в одно и то же место — глобальный объект, это следствие. Но переменная — есть переменная (она создаётся при входе в контекст, обладает {DontDelete}), а свойство — это свойство, оно лишено этих особенностей.
Логично — locals() (или, что тоже самое в данном случае — vars()), имеет ссылку на «z». Засчитывается, поскольку работает ;) Но есть одна особенность — locals() имеет ссылку на «z» при активации функции test, т.е. locals() заполняются при входе в функцию, а, значит, откуда-то черпают информацию. Откуда? И каким, тогда, должен быть ответ на доп. вопрос — можно ли получить значение «z» не запуская «test», т.е., по сути, без создания locals()?
> — Чем грозит объявление функции
> def foo(a=[]):
Дополнительный вопрос: как вернуть параметр «a» в состояние пустого списка после «грозящих» модификаций (допустим, функция foo вызвана три раза, внутри foo стоит a.append(1) — как на четвёртый вызов foo сделать так, чтобы «а» был пустым)?
> 14 Вроде бы в питоне «все — объекты», а значит у всех есть классы
Логично (и верно). И вытекающий дополнительный вопрос — можно ли породить тот же объект-точку (с координатами x и y и методом .move) без объявления класса?
11. Возможна ли делегация и композиция в Питоне? -> Почему нет? | Почему да? Приведите примеры.
12. Если объект не может ответить на сообщение, возможно ли это как-то обработать, перехватить? Почему нет | да? Приведите пример.
13. Будет ли создано две объекта-функции «m» при создании двух инстансов одного класса? А два объекта-метода? Почему равенство методов выдаёт False? См. пример:
class A(object):
def m(self):
pass
a = A()
b = A()
a.m == b.m # False
14. Возможны ли объекты без классов (например, точка с координатами x и y и методом перемещения)? Почему нет | да? Покажите пример.
1. «indexOf vs. search» — можно было и просто алгоритмы сравнить, чтобы увидеть, что .search не может быть быстрее .indexOf'a (это же надо преобразовать аргумент в RegExp (если необходимо), сколько действий в самом конструкторе RegExp'a, вызвать .exec, где тоже много действий). Но, практические результаты — тоже хорошо.
2. «document.getElementById vs. $() из jQuery» — действительно не понятно, каким боком это приплетено к графикам с «indexOf vs. search», но в целом — тоже понятно (если проанализировать код jQuery), что $(), перед тем, как вызовет document.getElementById, делает кучу дополнительных телодвижений и wrapper'ов.
Ну, это можно считать разновидностью static-а — свойство одно на все экземпляры.
> обьявление в конструкторе и есть замыкание
В смысле, объявление свойством функции? Нет, это не замыкание, это обычное свойство функции.
> которое живет не зависимо от конструктора после создания экземпляра
Замыкание может жить не зависимо от жизни порождаемого контекста. А экземпляр-то тут при чём? Конструктор порождает экземпляры, экземпляры имеют связь с конструктором через [[Prototype]].constructor. Объявляя свойство в конструкторе, это то же самое, что [[Prototype]].constructor.нашеСвойство; и с этой точки зрения, появляется лишь лишнее промежуточное свойство .constructor, чтобы достучаться до .нашеСвойство (если было бы в прототипе, — [[Prototype]].нашеСвойство). Однако, если объекты сами будут иметь такое свойство, то протоип уже не подойдёт, т.к. будет сразу найдено родное свойство.
> И область видимости — только данный экземпляр.
Какой данный эземпляр? Объявляя свойство в конструкторе — вы просто объявляется свойство в конструкторе, независимом объекте. Порождаемые конструктором объекты, после порождения уже могут быть не связаны с конструктором. Поэтому, в качестве этого хранилища может абсолютно любой объект, но конструктор — да, наиболее подходящий (по смыслу). Хранение в прототипе привёл в качестве альтернативы (хотя, здесь расшаривается только на чтение, после первой записи, объекты будет уже иметь своё такое свойство).
window
Имеется в виду — без объявления какого-либо дополнительного класса.
> def foo(a=[]):
Дополнительный вопрос: как вернуть параметр «a» в состояние пустого списка после «грозящих» модификаций (допустим, функция foo вызвана три раза, внутри foo стоит a.append(1) — как на четвёртый вызов foo сделать так, чтобы «а» был пустым)?
Кстати, ECMAscript в новых версиях тоже позаимствовал list comprehensions и генераторы у Питона.
Логично (и верно). И вытекающий дополнительный вопрос — можно ли породить тот же объект-точку (с координатами x и y и методом .move) без объявления класса?
Почему? Считаете себя асом, не желающим тратить время на «дурацкие вопросы»? ;)
11. Возможна ли делегация и композиция в Питоне? -> Почему нет? | Почему да? Приведите примеры.
12. Если объект не может ответить на сообщение, возможно ли это как-то обработать, перехватить? Почему нет | да? Приведите пример.
13. Будет ли создано две объекта-функции «m» при создании двух инстансов одного класса? А два объекта-метода? Почему равенство методов выдаёт False? См. пример:
14. Возможны ли объекты без классов (например, точка с координатами x и y и методом перемещения)? Почему нет | да? Покажите пример.
Можно ещё придумать ;)
2. «document.getElementById vs. $() из jQuery» — действительно не понятно, каким боком это приплетено к графикам с «indexOf vs. search», но в целом — тоже понятно (если проанализировать код jQuery), что $(), перед тем, как вызовет document.getElementById, делает кучу дополнительных телодвижений и wrapper'ов.
а почему она не проявилась в самой статье? ;)