用多级继承扩展基类方法(typescript)



我有三个类:

class A{
    DoStuff(){
        return "Called from A";
    }
}
class B extends A {
    constructor(){
        super();
        var baseDoStuff = super.DoStuff;
        this.DoStuff = function(){
            return baseDoStuff() + " and Called from B";
        }
    }
}
class C extends B { 
    constructor(){
        super();
        var baseDoStufffff = super.DoStuff;
        this.DoStuff = function(){
            return baseDoStufffff() + " and Called from C";
        }
    }
}

我期望类C的DoStuff()调用B的DoStuff()(它反过来会调用A的DoStuff())。

然而在C上调用DoStuff()只返回"从A调用和从C调用"。我哪里做错了?这不也应该调用B的方法吗?

可以在这里找到一个工作示例:

示例

当你需要使用super时使用类方法代替类成员:

class A{
    DoStuff(){
        return "Called from A";
    }
}
class B extends A {
    constructor(){
        super();      
    }   
    DoStuff (){
        return super.DoStuff() + " and Called from B";
    }
}
class C extends B { 
    constructor(){
        super();                
    }
    DoStuff(){
            return super.DoStuff() + " and Called from C";
    }
}
var c = new C();
console.log(c.DoStuff());

Try it(打印从A调用,从B调用和从C调用)

这是因为super转换为.prototype,即super.DoStuff()变成_super.prototype.DoStuff(), .prototype上唯一可用的东西是类方法。

: http://basarat.github.io/TypeScriptDeepDive//超级

JavaScript没有真正的方法。TypeScript试图用熟悉的符号来隐藏原型链的工作方式,但就像所有抽象一样,它并不完美。原型链的要点是,当你调用c.DoStuff()时,它在c实例上查找DoStuff,然后是原型(c),然后是原型(B),然后是原型(A),然后是原型(Object)。

不仅适用于函数,还适用于任何可能查找的成员。函数在JavaScript中并不是很特别,讽刺的是,这正是它们强大的原因。

在你的A类中使用TypeScript的语法,你把一个函数DoStuff放在A的原型中。你调用DoStuff的每个A实例都将在实例中查找它(可能找不到),查看原型并查看你定义的函数。到目前为止一切顺利。

然后你定义了一个类B,它扩展了a,所以原型链是B-> a ->Object。在B的构造函数中,您将每个实例上的函数的新副本赋值给DoStuff。(这会使用更多的内存。)当你构造一个新的B并在它上面调用DoStuff时,那里有一个函数,而不需要检查原型。

现在定义一个类C扩展B,原型链是C->B-> a ->Object。C语言的每个实例都会得到一个赋值给DoStuff的函数的副本。但在那个构造函数中我们不是从B的实例中抓取DoStuff,我们是从原型中抓取它,我们没有直接将那个函数添加到原型中。如果在那里找不到它,我们就沿着原型链到a .prototype,并从那里找到一个DoStuff成员来使用。这就是为什么C有对a的DoStuff的引用。

如果你做了这样的事情,你可以使你的代码像预期的那样工作:

class B extends A {
    constructor() {
        super();
    }
}
B.prototype.DoStuff = function () {
    return A.prototype.DoStuff() + " and Called from B";
}

相关内容

  • 没有找到相关文章

最新更新