Javascript (ES8) - Получить статическое значение класса из родительского класса. - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть класс Parent (определенный с помощью объявления class, хотя я знаю, что это в первую очередь синтаксический сахар) и несколько классов (Child1, Child2 и т. Д.), Расширяющих его.Дочерним классам назначено статическое свойство (за пределами их объявлений - насколько я знаю, нет способа назначить статическое свойство в объявлении класса).

Я хотел бы получить доступ кстатическое значение любого дочернего класса из родительского класса, например, в методе getStaticValue().

class Parent {
    constructor() {
        //Do parent stuff
    }

    getStaticValue() {
        return "The value of staticValue is " + this.staticValue;
    }
}

class Child1 extends Parent {
    constructor() {
        super();
        //Do child1 stuff
    }
}
Child1.staticValue = "Child1";

class Child2 extends Parent {
    constructor() {
        super();
        //Do child2 stuff
    }
}
Child2.staticValue = "Child2";

Я хочу получить доступ к значению staticValue любого произвольного дочернего класса из родительского класса, однако пытаюсьсделать так, как написано выше, всегда возвращает неопределенное.Другими словами:

let parentStaticValue = new Parent().getStaticValue();
//Desired output = "The value of staticValue is undefined"
//Actual output = "The value of staticValue is undefined"

let child1StaticValue = new Child1().getStaticValue();
//Desired output = "The value of staticValue is Child1"
//Actual output = "The value of staticValue is undefined"

let child2StaticValue = new Child2().getStaticValue();
//Desired output = "The value of staticValue is Child2"
//Actual output = "The value of staticValue is undefined"

Есть ли способ получить доступ к статическому значению дочернего класса из родительского класса без необходимости знать имя дочернего класса в каждом случае?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вы можете использовать свойство constructor экземпляра класса для доступа к статическим свойствам, которые хранятся как свойства функции конструктора экземпляра, например:

class Parent {
    constructor() {
        //Do parent stuff
    }

    getStaticValue() {
        return this.constructor.staticValue;
    }
}

Предупреждение

Свойство конструктора объекта унаследовано от цепочки прототипов.

Синтаксис класса сделал свойство объекта prototype объекта функции конструктора класса неконфигурируемым (хорошим),но оставил свойство constructor этого же объекта-прототипа доступным для записи (плохо).

НИКОГДА измените значение constructor объектов-прототипов конструкторов классов, если вы знаете, что хорошодля вас хотите, чтобы расширения классов работали корректно.

Демонстрация:

class Parent {
    constructor() {
        //Do parent stuff
    }

    getStaticValue() {
        return "The value of staticValue is " + this.constructor.staticValue;
    }
}

class Child1 extends Parent {
    constructor() {
        super();
        //Do child1 stuff
    }
}
Child1.staticValue = "Child1";

class Child2 extends Parent {
    constructor() {
        super();
        //Do child2 stuff
    }
}
Child2.staticValue = "Child2";

console.log(new Parent().getStaticValue()); 
console.log(new Child1().getStaticValue());
console.log(new Child2().getStaticValue());
0 голосов
/ 02 декабря 2018

Вы можете передать статическое значение родительскому конструктору, используя super () в дочернем классе:

class Parent {
    constructor(childStaticValue) { // receive the value from the children class
        this.staticValue = childStaticValue // and assign it to the local variable
    }

    getStaticValue() {
        return "The value of staticValue is " + this.staticValue;
    }
}

class Child1 extends Parent {
    constructor() {
        super(Child1.staticValue); // pass the value to the parent class
        //Do child1 stuff
    }
}
Child1.staticValue = "Child1";

class Child2 extends Parent {
    constructor() {
        super(Child2.staticValue); // pass the value to the parent class
        //Do child2 stuff
    }
}
Child2.staticValue = "Child2";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...