Есть ли аналог Object.prototype.hasOwnProperty? - PullRequest
2 голосов
/ 24 октября 2019

Дана следующая примерная структура класса:

class matter {
  constructor(atomicNumber) {
    this.atomicNumber = atomicNumber;
  }
}

class stone extends matter {
  constructor(atomicNumber, mohsHardness) {
    super(atomicNumber);
    this.mohsHardness = mohsHardness;
  }

  showProperties() {
    console.log(Object.getOwnPropertyNames(this));
  }
}

class gem extends stone {
  constructor(atomicNumber, mohsHardness, carat) {
    super(atomicNumber, mohsHardness);
    this.carat = carat;
  }
}

let chunk = new gem(6, 10, 1);
chunk.showProperties();

Вывод функции Object.getOwnPropertyNames, как и ожидалось,

['atomicNumber', 'mohsHardness', 'carat']

Как получить только свойства «родительских» классов,как было бы

['atomicNumber', 'mohsHardness']

Если я заменю функцию следующим образом:

showProperties() {
    const parentClass = Object.getPrototypeOf(Object.getPrototypeOf(this));
    console.log(Object.getOwnPropertyNames(parentClass));
}

Я получу результат

['constructor', 'showProperties']

Это оставляет меня в растерянности. Может быть, есть аналог Object.prototype.hasOwnProperty?

1 Ответ

2 голосов
/ 24 октября 2019

Проблема заключается в том, что при создании дочернего экземпляра this, указанный в конструкторах matter и stone, является точно таким же объектом, как this, указанный в дочернем конструкторе (gem),После того, как дочерний конструктор изменяет экземпляр, невозможно отличить свойство, добавленное дочерним конструктором, от свойства, добавленного супер-конструктором.

Единственный способ сделать что-то подобное - проверить объект послевызов super выполняется до того, как дочерний конструктор мутирует объект:

class matter {
    constructor(atomicNumber) {
        this.atomicNumber = atomicNumber;
    }
}

class stone extends matter {
    constructor(atomicNumber, mohsHardness) {
        super(atomicNumber);
        this.mohsHardness = mohsHardness;
    }

    showProperties() {
        console.log(this.parentProperties);
    }
}

class gem extends stone {
    constructor(atomicNumber, mohsHardness, carat) {
        super(atomicNumber, mohsHardness);
        this.parentProperties = Object.getOwnPropertyNames(this);
        this.carat = carat;
    }
}

let chunk = new gem(6, 10, 1);
chunk.showProperties();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...