Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   This (https://javascript.ru/forum/misc/2198-this.html)

arseniy-at-home 18.11.2008 09:15

This
 
Друзья, допустим есть вот такая конструкция

function MyClass()
{
this.Method1 = Method1
this.Method2 = Method2
}

function Method1()
{
...
}

function Method2()
{
...
}

var MyObject = new MyClass()

А теперь в методе объекта MyObject я хочу узнать имя объекта MyObject. Возможно ли такое?

Kolyaj 18.11.2008 10:27

var MyObject2 = MyObject;
var MyObject3 = MyObject;

Какое из имен MyObject вы хотите узнать?

arseniy-at-home 18.11.2008 10:30

Цитата:

Сообщение от Kolyaj (Сообщение 8562)
var MyObject2 = MyObject;
var MyObject3 = MyObject;

Какое из имен MyObject вы хотите узнать?

В методе хочу выяснить, какой объект работает, т.е. строку 'MyObject2' или 'MyObject3'.

Kolyaj 18.11.2008 10:51

Дык это один и тот же объект, просто на него ссылается несколько имен.

Вам зачем?

arseniy-at-home 18.11.2008 11:00

Цитата:

Сообщение от arseniy-at-home (Сообщение 8563)
В методе хочу выяснить, какой объект работает, т.е. строку 'MyObject2' или 'MyObject3'.

Цитата:

Сообщение от Kolyaj (Сообщение 8566)
Дык это один и тот же объект, просто на него ссылается несколько имен.

Вам зачем?

var MyObject1 = new MyClass()
var MyObject2 = new MyClass()

Kolyaj 18.11.2008 11:02

И в чем проблема?

arseniy-at-home 18.11.2008 11:12

Цитата:

Сообщение от Kolyaj (Сообщение 8568)
И в чем проблема?

Проблема получить имя объекта.

Kolyaj 18.11.2008 11:13

Зачем?

arseniy-at-home 18.11.2008 11:20

Цитата:

Сообщение от Kolyaj (Сообщение 8570)
Зачем?

Вопрос не зачем, а как.
А именно: как, если говорить терминами классического ООП, метод "класса" может получить имя "экземпляра"?

Но вы, по всей видимости, не имеете ответа.

Kolyaj 18.11.2008 11:30

В классическом ООП (и в любом другом тоже) нельзя получить имя экземпляра из метода, т.к. у экземпляра нет имени, есть ссылки на него, а вот у ссылок уже есть имена.

Octane 18.11.2008 11:35

Видимо вы не понимаете, что такое переменная - ссылка на объект. Вам привели пример, когда для одного и того же объекта существует несколько ссылок с разными именами и не понятно какое из них должен бы был выдать интерпритатор JavaScript на ваш запрос, поэтому такой возможности нет. Пересмотрите способ решения задачи так, чтобы не возникало потребности получать имя ссылки на объект.

Dmitry A. Soshnikov 18.11.2008 12:46

arseniy-at-home, Вам не нужно это, для идентификации текущего объекта, ссылки this должно хватать.


.ps: извращения ради:

Однако, если все же инстансы созданы вручную, и гарантированно нет ссылок в виде других переменных на эти инстансы, то задайте имя вручную - через свойство:

function A() {};
A.prototype.test = function () {
  alert(this.__instanceName);
};

var a = new A();
var b = new B();

b.__instanceName = 'b';
a.__instanceName = 'a';

a.test(); // a
b.test(); // b


Естественно, если будет ссылка:

var c = a;


то результат будет соотвествующий (взятый из объекта, на которых ссылается "с", т.е. из объета "а"):

c.test(); // a


что еще раз подтверждает, что это ненужная затея, и для этих целей есть ссылка this.

Еще более извращенное (только не вздумайте так делать, пишу ради прикола):

Если инстансы глобальные, то можно пройтись циклом по объекту window в поисках инстанса; далее, взять имя ключа window:

A.prototype.test = function () {
  for (var k in window) {
    if (window[k] === this) {
      alert('__instance: ' + k); // =)
    }
  }
};


a.test(); // a
b.test(); // b


И снова в случае ссылки, Вы получите бред:

var c = a;
c.tets(); // c, a


Так что, мыслите объектами в пространстве (со связями и ссылками друг на друга), а не статическими именами.

В дополнение можно почитать эту статью - http://javascript.ru/tutorial/object/thiskeyword.


Часовой пояс GMT +3, время: 13:26.