Javascript oop-like fail (?!?) - PullRequest
       1

Javascript oop-like fail (?!?)

0 голосов
/ 26 сентября 2011

Учтите это:

function f2(x) {
    return x+1;
};

X = function(){
    this.f1=function (x) {
      return 2*f2(x);
    }

    return this;
};

, тогда x = new X(); x.f1(1) работает нормально.

Но когда я хочу это сделать:

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*f2(x);
    }

    return this;
};

То же утверждение будет жаловатьсячто он не может найти f2.Например, в c # вы можете сказать

class X {
   int f2(int x){return x+1;}
   int f1(int x){return 2*f2(x);}
}

, и это будет работать

X x=new X();
x.f1(1)

Почему?

Ответы [ 5 ]

1 голос
/ 26 сентября 2011

Вам нужно явно указать f2 с ключевым словом this.

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*this.f2(x);
    }

    return this;
};
1 голос
/ 26 сентября 2011

потому что вы забыли это .f2.Javascript не видит переменные класса без этого

0 голосов
/ 26 сентября 2011

Для ссылки на f2 во втором блоке кода вам нужно будет использовать this.f2.this ссылается на контекст, в котором выполняется функция.Поскольку вы вызываете f1 следующим образом:

x.f1();

... context устанавливается на экземпляр, x.

JavaScript не делает переменные экземпляра доступными для области так же, как переменные области, то есть те, которые доступны напрямую:

X = function(){

    var f2 = 123;

    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {

        console.log(f2); // => 123
        console.log(this.f2); // => function(){}

        return 2 * this.f2(x);
    };

    return this;
};
0 голосов
/ 26 сентября 2011
X = function(){
       this.f2 = function(x) {
            return x+1;
       };    
       this.f1=function (x) {
            return 2*this.f2(x);  // <-- Need this here since it is not implicit
       }
       return this;
    };
0 голосов
/ 26 сентября 2011

Javascript не имеет неявного this, который вы получаете в C #. Вы должны добавить это в:

X = function(){
    this.f2 = function(x) {
        return x+1;
    };

    this.f1=function (x) {
        return 2*this.f2(x);
    };

    return this;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...