Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2012, 10:22
Интересующийся
Отправить личное сообщение для ugin_root Посмотреть профиль Найти все сообщения от ugin_root
 
Регистрация: 21.04.2011
Сообщений: 21

Передача this при обращение к объекту внутри класса
Хочу сделать что-то похожее на неймспейс в JavaScript. Но столкнулся с проблемой. При вызове функции внутри объекта ей как и положено передаётся в качестве параметра this её родитель. Обойти это можно вызывая функции при помощи метода apply, передавая нужный this. Можно ли сделать как нибудь так что-бы в качестве параметра this всегда передавался нужный объект?
function Foo(){
    this.param1="start";
    this.param2="stop";
}
Foo.prototype.get = {};
Foo.prototype.get.p1 = function(){
    alert(this.param1);
};

var foo = new Foo();
foo.get.p1.apply(foo);
foo.get.p1();


не знаю может есть что-то вроде:
foo.get.set_this(foo);
Ответить с цитированием
  #2 (permalink)  
Старый 14.08.2012, 10:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,501

Если совсем не думать, то: .bind(foo)
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 14.08.2012, 11:09
Интересующийся
Отправить личное сообщение для ugin_root Посмотреть профиль Найти все сообщения от ugin_root
 
Регистрация: 21.04.2011
Сообщений: 21

не совсем понял причём тут .bind()

В итоге мне нужно что-бы всегда при вызове foo.get.p1(); в качестве this передавался родительский объект т.е как при foo.get.p1.apply(foo); но что-бы не приходилось писать apply, и что-бы задавалась это при описании класса а не после создания экземпляра

Последний раз редактировалось ugin_root, 14.08.2012 в 11:12.
Ответить с цитированием
  #4 (permalink)  
Старый 14.08.2012, 11:35
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,501

function Foo(){
    this.param1="start";
    this.param2="stop";
    this.get.p1=this.get.p1.bind(this)
}
Foo.prototype.get = {};
Foo.prototype.get.p1 = function(){
    alert(this.param1);
};
 
var foo = new Foo();
foo.get.p1.apply(foo);
foo.get.p1();


А вообще да, я нихрена не понимаю зачем оно вам надо, потому тупо отвечаю на конкретный вопрос, без поиска нормального решения.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 14.08.2012, 12:12
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

Сообщение от ugin_root
Хочу сделать что-то похожее на неймспейс в JavaScript.
http://www.zencoder.pro/essential-js-namespacing
Ответить с цитированием
  #6 (permalink)  
Старый 14.08.2012, 12:55
Интересующийся
Отправить личное сообщение для ugin_root Посмотреть профиль Найти все сообщения от ugin_root
 
Регистрация: 21.04.2011
Сообщений: 21

Maxmaxmахimus,
Спасибо! то что нужно!
vadim5june,
перед написанием данного поста прочитал как раз эту статью. Но как назначить нужного "родителя" я там не нащёл. "похожее" было ключевым словом
Ответить с цитированием
  #7 (permalink)  
Старый 14.08.2012, 13:05
Интересующийся
Отправить личное сообщение для ugin_root Посмотреть профиль Найти все сообщения от ugin_root
 
Регистрация: 21.04.2011
Сообщений: 21

В итоге получается так:
function Foo(){
    this.param1="start";
    this.param2="stop";
    this.get.__parent__ = this;
}
Foo.prototype.get = {};
Foo.prototype.get.p1 = function(){
    alert(this.__parent__.param1);
};

var foo = new Foo();
foo.get.p1();


ещё раз спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 14.08.2012, 15:48
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от ugin_root Посмотреть сообщение
В итоге получается так:
function Foo(){
    this.param1="start";
    this.param2="stop";
    this.get.__parent__ = this;
}
Foo.prototype.get = {};
Foo.prototype.get.p1 = function(){
    alert(this.__parent__.param1);
};

var foo = new Foo();
foo.get.p1();


ещё раз спасибо!
Вы уверены, что это то, что нужно? Так уже не работает:
function Foo(param){
    this.param1=param;
    this.param2="stop";
    this.get.__parent__ = this;
}
Foo.prototype.get = {};
Foo.prototype.get.p1 = function(){
    alert(this.__parent__.param1);
};
 
var foo = new Foo("1");
foo.get.p1();
var foo2=new Foo("2");
foo.get.p1();
Ответить с цитированием
  #9 (permalink)  
Старый 14.08.2012, 16:14
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Вот моё решение:
function Foo(param){
    this.param1=param;
    this.param2="stop";
}
(function (self) {
  Foo.prototype={
    _get: {
      p1: function(){
        alert(self.param1);
      }
    },
    get get() {
      self=this;
      return this._get;
    }
  };
})();

var foo = new Foo("1");
foo.get.p1();
var foo2=new Foo("2");
foo.get.p1();
Ответить с цитированием
  #10 (permalink)  
Старый 14.08.2012, 16:26
Интересующийся
Отправить личное сообщение для ugin_root Посмотреть профиль Найти все сообщения от ugin_root
 
Регистрация: 21.04.2011
Сообщений: 21

oneguy,
Спасибо за пример!
А можно это всё как-нибудь проще организовать? я ничего проще этого примера придумать не смог...

Последний раз редактировалось ugin_root, 14.08.2012 в 17:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделить текст внутри input при получении фокуса InviS jQuery 12 30.09.2015 17:12
Передача аргумента методу при назначении события eval Events/DOM/Window 9 11.11.2010 07:03
Изменение класса в <div> при нажатии на него... xmartinesx Общие вопросы Javascript 2 08.10.2010 10:57
Обращение к элементу внутри метода .ajax() roma86 jQuery 2 19.03.2010 21:52
Добавление класса на елемент по id при фокусе на input Andrew_tl Events/DOM/Window 1 18.02.2010 19:09