Несколько вещей, которые я не понимаю о наследовании - PullRequest
3 голосов
/ 19 апреля 2019

Я создал такую ​​таблицу для «наследования».

  1. сравнить --- prototype ---> Animal.prototype (конструктор, запустить)
  2. Rabbit ---[[prototype]] ---> сравнить
  3. Кролик --- прототип ---> Животное
  4. Rabbit.prototype --- [[prototype]] ---> Animal.prototype(конструктор, запуск)
  5. кролик (имя: «Белый кролик») --- [[prototype]] ---> Rabbit.prototype
  6. кролик (имя: «Белый кролик»)--- прототип ---> Кролик

.

  • думаю, что это правда.Но укажите, если это не так.Я написал определенные коды, чтобы понять тему «наследования».Но некоторые не дали желаемого результата.Но некоторые не дали желаемого результата.(Спецификация в комментариях)
  class Animal {
    constructor(name, speed) {
      this.speed = speed;
      this.name = name;
    }

    run(speed = 0) {
      this.speed += speed;
      console.log(`${this.name} runs with speed ${this.speed}.`);
    }

    static compare(animalA, animalB) {
      console.log(animalA.speed - animalB.speed);
    }
  }

  class Rabbit extends Animal {
    hide() {
      console.log(`${this.name} hides!`);
    }
  }

  let rabbits = [
    new Rabbit("White Rabbit", 5),
    new Rabbit("Black Rabbit", 10)
  ];

  console.log(Rabbit.__proto__ === Animal); // true (not problem)

  console.log(Animal.__proto__ === Function.prototype); // true (not problem)

  console.log(Rabbit.__proto__ === Animal.prototype); //(not problem)
  console.log(Rabbit.__proto__.prototype === Animal.prototype); //(not problem)

  console.log(rabbits[1].__proto__ === Animal.prototype); 
  // this problem
  // rabbit(name:'White Rabbit') ---[[prototype]]---> Rabbit.prototype ?

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Это потому, что rabbits[1] является экземпляром Rabbit - следовательно, его прототип указывает на Rabbit, а поскольку Rabbit является расширением Animal, Rabbit.prototype указывает на Animal.prototype:

class Animal {
  constructor(name, speed) {
    this.speed = speed;
    this.name = name;
  }

  run(speed = 0) {
    this.speed += speed;
    console.log(`${this.name} runs with speed ${this.speed}.`);
  }

  static compare(animalA, animalB) {
    console.log(animalA.speed - animalB.speed);
  }
}

class Rabbit extends Animal {
  hide() {
    console.log(`${this.name} hides!`);
  }
}

let rabbits = [
  new Rabbit("White Rabbit", 5),
  new Rabbit("Black Rabbit", 10)
];

console.log(rabbits[1].constructor.name);
console.log(Rabbit.__proto__);
1 голос
/ 19 апреля 2019

Когда вы создаете объект [кролик] класса Rabbit, он получает свойство Rabbit.prototype в качестве своего свойства [[Prototype]]. и rabbit. proto (то есть [[Prototype]]) получает свойство Animamal.prototype. Так вот как кролик наследует свойства своего предка.

rabbit[1]<--(Inherits from Rabbbit which is rabbit[1].__proto__) <-- (Inherits from Animal rabbit[1].__proto__.__proto__)
1 голос
/ 19 апреля 2019

кролики - это объект Кролик , а не Животное (напрямую) Таким образом, proto кролика будет указывать на прото Кролика, а прото Rabbit будет указывать на протока Animal

отметьте это

rabbits[1].__proto__ === Rabbit.prototype
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...