webew
Войти » Регистрация
 
JavaScript

Получение ссылки на объект из метода (JavaScript)

29 августа 2008, 1:09
Автор: Octane
Возможно ли в анонимном объекте получить ссылку на него из метода в такой ситуации?

function Test() {
    this.str = 'test';
}
 
Test.prototype = {
    fn1: function() {
        alert(this.str);
    },
    fn: {
        fn2: function() {
            alert(???????.str);
        }
    }
};
 
new Test().fn.fn2();

То есть, как в этом случае в функции «fn2» получить ссылку на родительский объект и добраться до его атрибута «str»? Или в JavaScript так сделать невозможно, единственный выход — задать имя для объекта?
Добавить комментарий

bur

К сожалению, прямого решения такой задачи я не нашел. То есть, если у нас есть такой объект:

var obj {
   prop1 : '1',
   obj2 : {
      method : function() {}
   }
}


, то непонятно, как из obj.obj2.method() обратиться к prop1 без прямой ссылки на объект obj. Если найдете такое решение - пишите.
Однако, можно с помощью метода call объекта Function, который позволяет вызвать метод одного объекта, в контексте другого, сделать вот так:

function Test() {
    this.str = 'test';
}

Test.prototype = {
    fn1 : function() {
        alert(this.str);
    },
    fn : {
        fn2: function() {
            alert(this.str);
        }
    }
};

var obj = new Test();
obj.fn.fn2.call(obj);


Надеюсь, поможет...
29.08.2008, 11:57
Ответить
NO USERPIC

Octane

Да, call не совсем то, тогда внутренняя организация функции должна не использовать this как ссылку на родительский объект, а учитывать, что она будет вызвана в контексте указанного объекта.

У меня была идея создавать для каждого дочернего объекта ссылку на родительский:
function Test() {
    this.str = 'test';
}
 
Test.prototype = {
    fn1: function() {
        alert(this.str);
    },
    fn: {
        parent: function(obj) {
           return obj;
        }(this),
        fn2: function() {
            alert(this.parent.str);
        }
    }
};
 
new Test().fn.fn2();

но ссылка this.parent в этом случае ведет на window :(

Похоже придется хранить все на одном уровне вложенности объектов...
29.08.2008, 13:47
Ответить

bur

Хранить всё на одном уровне не обязательно, если это сильно нарушает архитектуру приложения.
Можно использовать обращение к родительскому объекту по имени. Оно с одной стороны не очень красиво, но вряд ли это имя будет изменено в ближайшие 100лет.
Если это вас убедит, то такой подход я встречал в AJAX-объекте одной авторитетной книги: "AJAX в действии". Авторы пользуются этим без зазрения совести.
29.08.2008, 13:58
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100