Iterating instance and prototype members

Есть у нас конструктор Circle с двумя характеристиками radius и move. И есть один прототипный метод draw.

function Circle (radius) {
    //Instance members
    this.radius = radius;
    this.move = function () {
        console.log('move');
    }
}

const c2 = new Circle(1);

//Prototype members
Circle.prototype.draw = function () {
    console.log('draw');
}

const c1 = new Circle(1);

Совсем не имеет значения когда мы изменим прототип. В данном случае мы модифицировали его перед созданием объекта.

Но мы можем сначала создать объект, а потом изменить прототип. И метод draw всё еще будет доступен для экземпляров. Потому что мы имеем дело со ссылками на объекты. У нас есть один объект в памяти, и как только мы изменили его, то все изменения сразу становятся доступны.

Давайте посмотрим как нам итерировать свойства экземпляра и прототипа.

Вы наверняка помите про метод Object.keys(). Давайте передадим ему объект c1.

Object.keys(c1);

Данный метод вернёт нам только методы экземпляра (radius, move). Но мы не увидим здесь прототипного метода draw.

Object.keys возвращает только методы и свойства экземпляра (instance).

Что по поводу for-in цикла?

for (let key in c1) console.log(key);

В данном случае мы увидим все свойства и методы как экземпляра, так и прототипа.

Чтобы проверить является ли свойство собственным свойством экземпляра, нужно воспользоваться методом hasOwnProperty.

c1.hasOwnProperty('draw');