2011-09-04 105 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原型中使用面向對象。

希望這會有幫助