Почему `this` ведет себя по-разному, когда наследуется в JavaScript и Java? - PullRequest
0 голосов
/ 27 мая 2018

Я сомневаюсь, что this отличается в JavaScript и Java при наследовании.

В Java:

class Animal {
    public String name = "animal";

    void hello() {
        System.out.println("hello " + this.name);
    }
}

class Dog extends Animal {
    public String name = "dog";
}

public class Main {
    public static void main(String...args) {
        Dog dog = new Dog();
        dog.hello(); // hello animal
    }
}

Приведенный выше код выведет hello animal, этоКажется, когда я вызываю метод hello в экземпляре подкласса Dog, он выводит свойство name в родительском классе Animal.

, но в Javascript оно отличается:

class Animal {
    constructor() {
        this.name = 'animal';
    }

    hello() {
        console.log('hello ' + this.name);
    }
}

class Dog extends Animal {
    constructor() {
        super();
        this.name = 'dog';
    }
}

const dog = new Dog();
dog.hello(); // hello dog

Когда вывидите, код с одинаковым логическим выводом отличается от результата.В коде JavaScript вывод метода приветствия hello dog, это свойство name экземпляра подкласса.

Я также пробую Python и C ++, в результате Python ведет себя как JavaScript, а C ++ ведет себя как Java.

Так ли это, потому что JavaScript и Python - это динамический язык?но каковы подробности этого и почему они сконструированы так?

и какую книгу я должен прочитать, чтобы узнать об этом?

спасибо большое, простите за плохой английский ...

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

В C ++ и Java, только функции могут быть виртуальными (то есть, искать динамически).В то время как в Python и JavaScript, все свойства / атрибуты / поля ищутся динамически.Предположительно C ++ и Java не хотели, чтобы язык обещал больше, чем можно было бы реализовать с нулевыми или низкими издержками.Принимая во внимание, что Python и JavaScript меньше заботятся о накладных расходах и больше заботятся о том, чтобы заставить язык просто делать то, что вы хотите.

Если вы хотите, чтобы C ++ вел себя как JavaScript, то вам нужно было бы написать виртуальную функцию доступа для доступасоответствующее поле.

class Animal {
  string name_;

  public:
    Animal() : name_ {"animal"} {
    }

    virtual string name() const {
      return name_;
    }

    void hello() {
        cout << "hello " << name();
    }
};

class Dog : public Animal {
  string name_;

  public:
    Dog() : name_ {"dog"} {
    }

    string name() const override {
      return name_;
    }
};

int main() {
  Dog dog;
  dog.hello(); // hello dog
}
0 голосов
/ 27 мая 2018

MDN - это начало.

Большинство книг на Javascript, предназначенных для программистов, будут охватывать «это».

В Learning есть список книгJavascript раздел.В Интернете есть несколько бесплатных книг.

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