Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коллекция private`ных переменных 
V
    Опции темы
Се ля ви
Дата 9.6.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Нужно получить список переменных, которые доступны в некотором месте программы.

Если это место - базовый контекст - window - то всё в порядке: все переменные, будь они объявлены хоть с, хоть без ключевого слова var, нам легко доступны:
Код
var d = 1;
alert('d = ' + d); //'d = 1'
alert('this.d = ' + this.d); //'this.d = 1'

d1 = 2;
alert('d1 = ' + d1); //'d1 = 2'
alert('this.d1 = ' + this.d1); //'this.d1 = 2'

this.d2 = 3;
alert('d2 = ' + d2); //'d2 = 3'
alert('this.d2 = ' + this.d2); //'this.d2 = 3'

alert('window === this = ' + (window === this)); //'window === this = true'

, ну и, соответственно, мы сможем получить их список, перебрав конструкцией for-in свойства объекта window или this (как видим, в этом контексте они - одно и то же).

Ситуация немного меняется, когда мы пытаемся выявить список переменных внутри контекста функции:
Код
var D = function(){
    
    var d = 1;
    alert('d = ' + d); //'d = 1'
    alert('this.d = ' + this.d); //'this.d = undefined' - !!!
    
    d1 = 2;
    alert('d1 = ' + d1); //'d1 = 2'
    alert('this.d1 = ' + this.d1); //'this.d1 = 2'
    
    this.d2 = 3;
    alert('d2 = ' + d2); //'d2 = 3'
    alert('this.d2 = ' + this.d2); //'this.d2 = 3'
    
    alert('window === this = ' + (window === this)); //'window === this = true'
    alert('this === D = ' + (this === D)); //'this === D = false'
}
D();

, т.е. тут мы уже не можем достать private`ную переменную d из контекста this (из контекста window - тоже, поскольку здесь они по-прежнему одно и то же), мы получаем к ней доступ только обратившись по имени непосредственно - соответственно, у нас нет такого объекта, перечислив свойства которого, мы могли бы увидеть эту переменную.

Ну и третий вариант: контекст конструктора объекта:
Код
/** @constructor */
var D = function(){
    
    var d = 1;
    alert('d = ' + d); //'d = 1'
    alert('this.d = ' + this.d); //'this.d = undefined'
    alert('window.d = ' + window.d); //'window.d = undefined'
    
    d1 = 2;
    alert('d1 = ' + d1); //'d1 = 2'
    alert('this.d1 = ' + this.d1); //'this.d1 = undefined'
    alert('window.d1 = ' + window.d1); //'window.d1 = 2'
    
    this.d2 = 3;
    //alert('d2 = ' + d2); //Если оставить - будет Error: 'd2 is not defined'
    alert('this.d2 = ' + this.d2); //'this.d2 = 3'
    alert('window.d2 = ' + window.d2); //'window.d2 = undefined'
    
    alert('window === this = ' + (window === this)); //'window === this = false'
    alert('this === D = ' + (this === D)); //'this === D = false'
    
    d3 = this;
}
objD = new D;
alert('d3 === objD = ' + (d3 === objD)); //'d3 === objD = true'

Т.к. window и this - уже разные объекты, выводим ещё и ссылки в контексте window.
Что мы видим? Теперь переменные у нас по совместительству стали полями объекта. При чём, в отличие от других контекстов теперь слово var приобрело важное значение - без него переменная объявляется в контексте window, а с ним - объявляется в некотором неявном внутреннем контексте.

Может быть, это контекст this? Нет - в этом контексте этих переменных нет тоже, а в нём есть только переменные, явно объявленные this.<имя_переменной>, это public-переменные.

На что же ссылается контекст this? Как видим, последняя строчка кода выводит true - т.е. this ссылается на создаваемый конструктором объект.

И вот вопрос - где же находятся переменные private (объявленные с ключевым словом var)? Где их искать, как их получить, если мы не знаем их имён? Кто-нибудь знает, как получить доступ к этому самому неявному внутреннему контексту?


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
AKS
Дата 9.6.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Се ля ви @  9.6.2008,  13:41 Найти цитируемый пост)
И вот вопрос - где же находятся переменные private (объявленные с ключевым словом var)? Где их искать, как их получить, если мы не знаем их имён? Кто-нибудь знает, как получить доступ к этому самому неявному внутреннему контексту?

Ответы на ваши вопросы находятся в 10.1.6 Activation Object (ECMAScript Language Specification Edition 3). 

PM MAIL   Вверх
dsCode
Дата 9.6.2008, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 565
Регистрация: 8.9.2007
Где: Saint-Petersburg

Репутация: 19
Всего: 26





--------------------
the .code inside
:my music
PM MAIL WWW ICQ Jabber   Вверх
Се ля ви
Дата 10.6.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(10.1.6 Activation Object (ECMAScript Language Specification 3rd edition))
The activation object is purely a specification mechanism. It is impossible for an ECMAScript program to access the activation object. It can access members of the activation object, but not the activation object itself.

Кароче, труба...

А жаль.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
AKS
Дата 11.6.2008, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: 27
Всего: 52



Цитата(Се ля ви @  10.6.2008,  21:42 Найти цитируемый пост)
Кароче, труба...

Это что за "труба"? smile Крест на всех благих начинаниях? ;) Не отчаивайтесь так - наверняка можно найти выход...

PM MAIL   Вверх
Се ля ви
Дата 11.6.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java/SOAрхитектор
****


Профиль
Группа: Модератор
Сообщений: 2016
Регистрация: 5.6.2004
Где: place without tim e and space

Репутация: 5
Всего: 127



Цитата(AKS @  11.6.2008,  07:09 Найти цитируемый пост)
Цитата(Се ля ви @  10.6.2008,  21:42 Найти цитируемый пост)
Кароче, труба...

Это что за "труба"? smile Крест на всех благих начинаниях? ;) Не отчаивайтесь так - наверняка можно найти выход...

Смотря в чём выход.
Я, кажется, нащупал, как избавиться от создания функций в каждом объекте при наследовании, но вот это обстоятельство делает это очень неудобным и громоздким. Распишу когда закончу тестирование.


--------------------
  )
 (
[_])
проф. блог

Кролики думали, что занимаются любовью, а на самом деле их просто разводили...
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.