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

时间:2011-03-30 07:22:46

标签: 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;
 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
}

2 个答案:

答案 0 :(得分:1)

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

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

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

或者你可以使用Douglas Crockford(只是谷歌)推广的“功能”风格。

Michael Bolin有good article讨论这两种风格。

JavaScript中的大多数OO实现都是这两种样式的变体。

强烈要求强烈采用一个JavaScript库,为您完成所有这些工作。我的个人建议是Dojo Toolkit

答案 1 :(得分:0)

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

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

我在此博客文章中详细介绍了这一点: Simple, Efficient Supercalls in 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"

(我不喜欢再把它们称为类,它们不是类,它们是构造函数。但是文章仍然有makeClass名称,所以......)

请注意方便的作用域功能,这样您就可以拥有完全隐藏在外部世界之外的“类”的实用功能;因此,您的实例函数可以具有适当的名称which is a good thing