Почему мы не можем получить доступ к свойствам суперкласса без вызова суперконструктора в подклассе?

  1. Почему мы не можем получить доступ к свойствам суперкласса без вызова суперконструктора в подклассе?

    // Shape - superclass
    function Shape() {
        this.x = 10;
        this.y = 20;
    }
    // Rectangle - subclass
    function Rectangle() {
        // Shape.call(this);
    }
    
    // subclass extends superclass
    // inheritance part code
    Rectangle.prototype = Object.create(Shape.prototype);
    Rectangle.prototype.constructor = Rectangle;
    
    var rect = new Rectangle();
    
    console.log( rect instanceof Shape);    // true
    console.log(rect.x);    // undefined
    console.log(rect.y);    // undefined
    
  2. Если я вызываю Super Constructor в Sub Class, я могу получить доступ к свойствам Super Class с Sub Sub Object без написания части кода наследования. Значит ли это, что нам не нужно писать этот код для достижения наследования, достаточно просто вызвать конструктор суперкласса? но я наблюдаю в этом случае прямоугольник объекта подкласса не рассматривается как instanceof Форма, чтобы мы не достигли наследства, не так ли?

    // Shape - superclass
    function Shape() {
        this.x = 10;
        this.y = 20;
    }
    // Rectangle - subclass
    function Rectangle() {
        Shape.call(this);
    }
    
    // subclass extends superclass
    // inheritance part code
    // Rectangle.prototype = Object.create(Shape.prototype);
    // Rectangle.prototype.constructor = Rectangle;
    
    var rect = new Rectangle();
    
    console.log( rect instanceof Shape);    // false
    console.log(rect.x);    // 10
    console.log(rect.y);    // 20
    

1 ответ

Конструктор

Видишь ли, то, что ты там сделал, не совсем класс. Вы сделали функцию Shape и другая функция Rectangle, Если вы хотите, чтобы обе функции инициализировали ваш объект, вы должны убедиться, что они оба вызваны к нему. Вы могли бы даже вызвать больше конструкторов для одного и того же объекта.

Что на самом деле делает конструктор в JavaScript: когда function называется с new оператор, this в этом function будет новым Object а также this.prototype будет такой же, как эта функция prototype, Объект также будет возвращен в конце вызова. Итак, видите, это не тот же конструктор, что и в других языках.

"Inheritance"

В совершенно другой кусок кода, вы назначены Shape.prototype в Rectangle.prototype, Что означает только то, что Shape.prototype будет следующим в цепи поиска прототипов, если свойство не найдено в Rectangle экземпляр или в Rectangle.prototype,

Как работают прототипы: вы хотите значение с именем myObject.x, Если myObject не имеет такого свойства, myObject.prototype.x будет возвращен. Если этого не существует, myObject.prototype.prototype.x будет возвращен. И так далее, пока не дойдет Object.prototype, Вы также можете различить свойство, которое действительно является свойством объекта, и унаследованное свойство, используя Object.prototype.hasOwnProperty,

Другие вопросы по тегам