javascript继承使用以前重新定义的函数

javascript继承使用以前重新定义的函数,javascript,function,inheritance,reusability,Javascript,Function,Inheritance,Reusability,我已经接受在javascript中实现多重继承的方法不止一种。我不明白的是如何调用父函数。我就是这样做的 function person(name){ this.name=name; this.display=function(){alert(this.name);} this.personDisplay=this.display; //pointer to parent function } function employee(name,ID){ this.person=person;

我已经接受在javascript中实现多重继承的方法不止一种。我不明白的是如何调用父函数。我就是这样做的

function person(name){
 this.name=name;
 this.display=function(){alert(this.name);}
 this.personDisplay=this.display; //pointer to parent function
}
function employee(name,ID){
 this.person=person;
 this.person(name);
 this.ID=ID;
 this.display=function(){this.parentDisplay();alert(this.ID);}
}
但我想知道是否有一种正确的方法可以重用父函数,例如

function employee(name,ID){
 this.person=person;
 this.person(name);
 this.ID=ID;
 this.display=function(){parent.display();alert(this.ID);} //ideally what I want
}

我不是很理解你的代码(你指的是一个没有在任何地方定义的
parentDisplay
函数;你的意思是
personDisplay
?),但是如果你想利用JavaScript的原型继承,您不能使用此上的任何属性来引用父对象,因为您将遇到孙子问题:以这种方式创建父/子层次结构很容易,但一旦尝试创建祖父母/父/子层次结构,它就会失败。这是因为对象实例始终是子对象,即使在父代码运行时也是如此,因此,如果父代码尝试使用相同的属性引用其父代码,则它最终会引用回自身并递归,直到堆栈耗尽

因此,您在
上使用的不是属性。我的解决方案是在函数实例本身上使用一个属性和一些管道。定义子类时,将超类的函数版本指定给子类的函数版本上的属性。然后,所有级别的代码都可以使用该属性引用函数的父版本

我在这篇博文中详细介绍了这一点:。使用本文中创建的帮助器,您可以执行以下操作:

var Parent = Helper.makeClass(function(){
    function foo() {
        return "P";
    }
    return {foo: foo};
});

var Child = Helper.makeClass(Parent, function(){
    function foo() {
        return foo.$super.call(this) + " < C";
    }
    return {foo: foo};
});

var GrandChild = Helper.makeClass(Child, function(){
    function foo() {
        return foo.$super.call(this) + " < GC";
    }
    return {foo: foo};
});

var gc = new GrandChild();
alert(gc.hierarchy()); // Alerts "P < C < GC"
var Parent=Helper.makeClass(函数(){
函数foo(){
返回“P”;
}
返回{foo:foo};
});
var Child=Helper.makeClass(父级,函数(){
函数foo(){
返回foo.$super.call(this)+“
(我不想再叫它们类了,它们不是类,它们是构造函数。但是这篇文章仍然有
makeClass
名称,所以…)


注意方便的作用域函数,这样您就可以为您的“类”提供完全隐藏在外部世界之外的实用程序函数;因此实例函数可以有专有名称。

这不是多重继承。只有单一继承

在JavaScript中,要模拟基于类的面向对象编程,需要使用原型。从技术上讲,JavaScript是一种原型语言,而不是面向对象的语言,但您可以非常成功地模拟OO风格的类

使用原型通常是“古典”或“伪古典”风格

或者你可以使用道格拉斯·克罗克福德(Douglas Crockford)推广的“功能性”风格(只需谷歌一下)

Michael Bolin对这两种风格进行了讨论

JavaScript中的大多数OO实现都是这两种风格的变体


强烈地敦促您采用一个JavaScript库来为您完成所有这些。我个人的建议是。

这似乎不是多重继承?对于基于单个继承类的构造函数,有几种方法和技术。然而,强烈建议您采用一个JavaScript框架来完成所有这些。我个人推荐Dojo工具包。对不起,我不知道为什么我称它为多重继承。“我的意思是扩展功能。@Crowder:我担心我将不得不做大量的管道工程。Darn@puk字体这真的不是很多水管。为了清晰起见,那篇文章中的代码相当详细,但即使是带有完整注释的最终结果、对mixin的支持以及对事后层次结构mods的支持(一个边缘案例),也只有217行;没什么好抱怨的。在分配方面,它是2115个字符;简单模式下的字符数为1242个,高级模式下的字符数为1156个。@puk,这真的不是很多@Crowder的实现是我见过的最短最简单的实现之一!全面到足以做真正的工作,就是。不过,我不建议你自己做。@Stephen:我只是浏览了所有的Dojo教程,它们没有提到继承。尽管它看起来确实比标准javascript好得多。那么,jQuery,你也推荐这个吗?ThanxjQuery AFAIK没有标准的基于类的机制,尽管有一些流行的插件。Dojo非常面向对象。查看《快速入门指南》并查找dojo。声明。@stephen:我必须同意dojo显著改进了javascript。@puk,不仅仅是dojo。有很多流行的JavaScript库。在做出选择之前,你应该先看看它们。这一选择很可能会一直伴随着你。@Stephen,@puk:“……虽然有一些流行的插件……”很快就会成为另一个插件;一段时间以来,我一直计划将我的作为jQuery插件发布,并期望很快实现它。;-)@puk:也有一个继承机制,尽管Bewarning说它的超级调用方法很容易使用,但在运行时非常昂贵。提醒你,90%的时候,你真的不在乎,因为你没有在一个紧密的循环中调用这些。但是当你这么做的时候。。。