2011-09-04 102 views
4

说我有一个类:Javascript和继承

function Foo() { 
    this.foo1 = null; 
    this.foo2 = function() { return false;}; 
} 

而且我想其他对象继承它的变量&功能。

function Bar(){} 
function Baz(){} 

然后实例我的对象:

var bar = new Bar(); 
bar.foo1 // returns null 
bar.foo2() // returns false 

什么是正常功能包括BarBazFoo


我已经做Bar.prototype = new Foo();但它似乎无法在我们敬爱的IE(< 9)。

+1

这绝对不是一个独特的问题。 http://stackoverflow.com/search?q=javascript+inheritance –

回答

5

如果将所有属性的原型(这是优选的,至少对于方法),

function Foo() {} 

Foo.prototype.foo1 = null; 
Foo.prototype.foo2 = function() { return false;}; 

然后分配父的原型孩子的原型就足够了:

function inherit(Child, Parent) { 
    var Tmp = function(){}; 
    Tmp.prototype = Parent.prototype; 
    Child.prototype = new Tmp(); 
    Child.prototype.constructor = Child; 
} 

inherit(Bar, Foo); 

这里我们使用了一个中间构造函数来“解耦”这两个原型。否则,如果你改变一个,你也会改变另一个(因为它们引用同一个对象)。这种方式实际上非常受欢迎,并被一些图书馆使用。

如果没有,你有打电话给孩子的构造函数中的父类的构造函数:

function Bar() { 
    Foo.call(this); 
} 

这是你总是应该做的,分配在构造函数中设置为当前对象的属性。


的附加注释,以自己的方式:

Bar.prototype = new Foo(); 

应该工作(也是在IE实际上),但它有两个重大缺陷:

  • 所有设置在Foo中的实例属性将成为所有共享的属性Bar实例。

  • 如果Foo预计只有在创建Bar实例时才可用,那么该怎么办?

1

,看一下Classy或者,如果你喜欢红宝石,并希望JS.Class一个更完整的解决方案。这些库可以帮助您在开发人员的javascript ad hide原型中使用面向对象。

希望这会有帮助