Статические члены ES6 наследуются дочерними классами - PullRequest
0 голосов
/ 06 июня 2018

Я обнаружил, что статические члены класса наследуются его дочерними классами в JavaScript.Я протестировал его с Chrome 67.0.3396.62, FireFox 60.0.1 и NodeJS 10.1.0.

Но не странно ли, что в ООП статические члены и поля должны принадлежать классу и не наследоваться?

Это ошибка для JavaScript extends?

class A {
  static a () {
    console.log('==[static a]==')
  }
}

A.propA = { anything: '==[static data from A]==' }

class B extends A { }

console.log(B.a()) // "==[static a]=="
console.log(B.propA.anything) // "==[static data from A]=="

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Это ошибка для JavaScript extends?

Нет, она работает точно так, как задумано.

Так где же на самом деле класс Bнайти его унаследованное propA свойство?Через какую часть цепочки прототипов?

Давайте сначала выясним две вещи:

  • Функции - это объекты, из которых следует, что у них есть прототип.По умолчанию это Function.prototype, где определяются такие методы, как .call и .apply.
  • "Статические члены" - это просто свойства объекта функции

При выполнении

class B extends A {}

затем создается новый функциональный объект для B, который в качестве прототипа имеет значение A, а не Function.prototype, и, следовательно, все свойства A доступны через B.

Мы легко можем это проверить:

class A {}
class B extends A {}
console.log(Object.getPrototypeOf(B) === A);
0 голосов
/ 06 июня 2018

Это очень хорошая ссылка , чтобы понять, как static работает с приведенным ниже кодом в качестве примера.

class Triple {
  static triple(n) {
    if (n === undefined) {
      n = 1;
    }
    return n * 3;
  }
}

class BiggerTriple extends Triple {
  static triple(n) {
    return super.triple(n) * super.triple(n);
  }
}

console.log(Triple.triple());        // 3
console.log(Triple.triple(6));       // 18

var tp = new Triple();

console.log(BiggerTriple.triple(3));
// 81 (not affected by parent's instantiation)

console.log(tp.triple());
// 'tp.triple is not a function'.

Для прямого ответа на ваш вопрос:

Статические вызовы методов выполняются непосредственно в классе и не могут вызываться в экземплярах класса.Статические методы часто используются для создания служебных функций.

...