Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача this при обращение к объекту внутри класса (https://javascript.ru/forum/misc/30739-peredacha-pri-obrashhenie-k-obektu-vnutri-klassa.html)

ugin_root 14.08.2012 10:22

Передача 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);

Aetae 14.08.2012 10:55

Если совсем не думать, то: .bind(foo)

ugin_root 14.08.2012 11:09

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

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

Aetae 14.08.2012 11:35

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();


А вообще да, я нихрена не понимаю зачем оно вам надо, потому тупо отвечаю на конкретный вопрос, без поиска нормального решения.

vadim5june 14.08.2012 12:12

Цитата:

Сообщение от ugin_root
Хочу сделать что-то похожее на неймспейс в JavaScript.

http://www.zencoder.pro/essential-js-namespacing

ugin_root 14.08.2012 12:55

Maxmaxmахimus,
Спасибо! то что нужно!
vadim5june,
перед написанием данного поста прочитал как раз эту статью. Но как назначить нужного "родителя" я там не нащёл. "похожее" было ключевым словом

ugin_root 14.08.2012 13:05

В итоге получается так:
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();


ещё раз спасибо!

oneguy 14.08.2012 15:48

Цитата:

Сообщение от ugin_root (Сообщение 197418)
В итоге получается так:
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();

oneguy 14.08.2012 16:14

Вот моё решение:
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();

ugin_root 14.08.2012 16:26

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


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