Tom M
Tom M

Reputation: 2904

Access method of specific ancestor

I'm currently trying to access the method of a specific ancestor in my dependency chain. Specifically, I want to run ParentClass.logName() from my initialized GrandChildClass. This is how I access the ParentClass prototype (approach taken from Get parent class name from child with ES6?).

class AncestorClass {
    constructor (name, id){
        this.name = name + id;
    }
    logName () {
        console.log(this.name);
    }
    
}

class ParentClass extends AncestorClass {
    constructor (name, id) {
        super(name, 1);
        this.name = name + id;
    }
}

class ChildClass extends ParentClass {
    constructor (name, id) {
        super(name, 2);
        this.name = name + id;
    }
}

class GrandchildClass extends ChildClass {
    constructor (name, id){
        super(name, 3);
        this.name = name + id;
    }
}

const grandchild = new GrandchildClass('testName', 4);
const parent =  Object.getPrototypeOf((Object.getPrototypeOf(grandchild.constructor)));
console.log(parent);
const initParent = new parent();
initParent.logName();

So I got the prototype and initialized it with the new keyword but for some reason initParent.logName() returns NaN.

So how do I call to ParentClass.logName from my grandchild without initializing ParentClass directly?

Upvotes: 0

Views: 74

Answers (1)

Ulysse BN
Ulysse BN

Reputation: 11423

You initialize parent with an empty constructor, which means both attribute are undefined and undefined + undefined gives NaN.

const initParent = new parent('foo', 1);
initParent.logName() // print 'foo1'

class AncestorClass {
    constructor (name, id){
        this.name = name + id;
    }
    logName () {
        console.log(this.name);
    }
    
}

class ParentClass extends AncestorClass {
    constructor (name, id) {
        super(name, 1);
        this.name = name + id;
    }
}

class ChildClass extends ParentClass {
    constructor (name, id) {
        super(name, 2);
        this.name = name + id;
    }
}

class GrandchildClass extends ChildClass {
    constructor (name, id){
        super(name, 3);
        this.name = name + id;
    }
}

const grandchild = new GrandchildClass('testName', 4);
const parent =  Object.getPrototypeOf((Object.getPrototypeOf(grandchild.constructor)));
console.log(parent);
const initParent = new parent('foo', 1);
initParent.logName();

Upvotes: 2

Related Questions