函数的 Javascript 类继承

IT技术 javascript class inheritance
2021-03-09 20:52:59

我已经建立了一个基类作为标准:

MyBase = function() {
    this.m_Stuff = 0; // etc
};
MyBase.prototype.MySuperFunction = function (arg1) {
    alert("Hello" + arg1);
};

接下来我设置另一个继承MyBase的类

MyChild = function () {
    MyBase.call(this);
    this.m_OtherStuff = 1; // etc
};
MyChild.prototype = new MyBase(); // innherit

但是然后(这是我不知道该怎么做的一点)我想用更好的方法覆盖 MyBase 的 MySuperFunction,但在此过程中调用基类函数:

MyChild.prototype.MySuperFunction = function (arg1, arg2) {
    MyBase.MySuperFunction(arg1); // THIS LINE IS THE LINE I DONT KNOW HOW TO DO
    alert("You is a " + arg2 + "'th level idiot");
};

它的子类想要覆盖是基类函数,但是想在新的改进定义中调用基类函数。

这可能吗,如果可以,怎么做?

2个回答

它类似于您继承的构造函数中的调用。您仍然可以访问“超级”方法MyBase.prototype.MySuperFunction(您分配它的地方),因此请使用:

MyBase.prototype.MySuperFunction.call(this, arg1);

对于更动态的方法,您甚至可能会使用它Object.getPrototypeOf来获取原型,但要注意它与动态继承一起使用。如果您有许多方法需要调用其父方法,则将别名MyBase.prototype作为super变量会很有帮助,变量可被 Child 原型对象上的所有函数访问(请参阅此答案以获取示例)。

是的,它被称为module模式——基本上是在 IEFE 中包装构造函数和原型赋值。另请参阅此问题顺便说一句,你不需要对我大喊大叫:-)
2021-04-16 20:52:59
不,原型属性必须在构造函数之外声明
2021-04-17 20:52:59
@Bergi有没有办法来调用这个原型的事情的函数/对象的原始申报?这个要点提供了一个我正在谈论的例子
2021-04-25 20:52:59
@贝尔吉!!!!!!!!!这太丑了,不是吗?我的意思是我想知道与定义的“对象”相关的所有内容都封装在这些大括号内..否则任何人都可以在大型项目中的 100 个 js 文件内的任何地方添加各种内容..有没有办法解决这个问题?
2021-04-25 20:52:59
所以澄清一下,你是说我孩子的函数将是 MyChild.prototype.MySuperFunction = function (arg1, arg2) {MyBase.prototype.MySuperFunction.call(this, arg1); alert("你是个" + arg2 + "'th level idiot"); };
2021-04-29 20:52:59

请应用以下内容:-

MyBase.prototype.MySuperFunction.call(this, arg1);
所以澄清一下,你是说我孩子的函数将是 MyChild.prototype.MySuperFunction = function (arg1, arg2) {MyBase.prototype.MySuperFunction.call(this, arg1); alert("你是个" + arg2 + "'th level idiot"); }; 另外,当我在其他地方设置实例时;var mychild = new MyChild(); 然后我会调用函数的孩子版本: mychild.MySuperFunction("Dave", "7");
2021-04-24 20:52:59