我已经接受了在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
}
答案 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。