Как получить значение this для функции вызывающего абонента? - PullRequest
9 голосов
/ 13 июня 2011

Если у меня есть такая функция:

function foo(_this) {
    console.log(_this);
}

function bar() {}
bar.prototype.func = function() {
    foo(this);
}

var test = new bar();
test.func();

тогда test экземпляр bar регистрируется.

Однако, чтобы это работало, я должен передать this в функцию bar.prototype.func. Мне было интересно, возможно ли получить такое же this значение без прохождения this.

Я пытался использовать arguments.callee.caller, но это возвращает саму функцию-прототип, а не значение this внутри функции-прототипа.

Можно ли зарегистрировать test экземпляр bar, просто вызвав foo() в функции-прототипе?

Ответы [ 4 ]

4 голосов
/ 13 июня 2011

Если вопрос «без прохождения этого (любым способом)», тогда ответом будет: нет

значение может быть передано альтернативными методами.Например, используя global var (в классе Bar) или сеанс или файлы cookie.

    function bar() {

      var myThis;

      function foo() {
          console.log(myThis);
      }

      bar.prototype.func = function() {

          myThis = this;
           foo();
      }
   }

   var test = new bar();
   test.func();
1 голос
/ 20 января 2015

Как насчет этого?

"use strict";
var o = {
    foo : function() {
        console.log(this);
    }
}

function bar() {}
bar.prototype = o;
bar.prototype.constructor = bar;
bar.prototype.func = function() {
    this.foo();
}

var test = new bar();
test.func();

Или это:

"use strict";
Function.prototype.extender = function( o ){
    if(typeof o ==  'object'){
        this.prototype = o;
    }else if ( typeof o ==  'function' ) {
        this.prototype = Object.create(o.prototype);
    }else{
        throw Error('Error while extending '+this.name);
    }
    this.prototype.constructor = this;
}
var o = {
    foo : function() {
        console.log(this);
    }
}

function bar() {}
bar.extender(o);
bar.prototype.func = function() {
    this.foo();
}

var test = new bar();
test.func();
1 голос
/ 13 июня 2011

Я думаю, что вызов foo в контексте bar должен работать:

function foo() {
    console.log(this.testVal);
}

function bar() { this.testVal = 'From bar with love'; }
bar.prototype.func = function() {
    foo.call(this);
}

var test = new bar();
test.func(); //=> 'From bar with love'
0 голосов
/ 24 июля 2013

Вы можете сделать это без изменения внешней функции, но вы должны изменить способ ее вызова.

Вы не можете получить контекст вызывающей стороны, но вы можете установить свойство this вфункция, которую вы вызываете с помощью метода apply или call .См. эту ссылку для объяснения this.

function foo()
{
    console.log( this );
}

function bar()
{
    bar.prototype.func = function func() 
    {
        foo.apply( this );
    };
}

var test = new bar();
test.func();

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

В качестве примера парадигмы ООП javascript проверьте мой ответ здесь .

...