Почему мы не можем получить доступ к свойствам суперкласса без вызова суперконструктора в подклассе?
Почему мы не можем получить доступ к свойствам суперкласса без вызова суперконструктора в подклассе?
// 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
Если я вызываю 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
,