2011-07-22 193 views
0

我有這樣的對象,dive原型繼承

var dive = new Foo.Bar(); 

而且Foo.Bar看起來是這樣的:

var Foo = { 
    Bar: function() { 
     ... 
     return function() { 
     // do stuff, no return 
     }; 
    } 
}; 

我想dive有另一個所有的原型,現有的對象,但是。比方說,window.Cow.prototype是:

{ 
    moo: function() { ... }, 
    eat: function() { ... } 
} 

什麼我需要做的Foo.Bar這樣我可以做到這一點:

dive.moo(); 
dive.eat(); 
+3

你明白,這樣你的代碼的作品,「潛水」本身就是一個功能,對吧? –

+0

你爲什麼要調用'Bar'作爲構造函數?它被定義爲返回一個自定義函數...或者:爲什麼Bar'返回一個自定義函數,如果它是一個構造函數? –

+0

你想創建可調用對象嗎? – user113716

回答

0
工作示例

謝謝你的開始,jimbojw!你是接近,但你給了我足夠的信息來得到它:

function Cow() { 
    return { 
     talk: function() { 
      alert("mooo"); 
     } 
    }; 
} 

var Foo = { 
    Bar: function() { 
     function result() { 
      alert("Foo.Bar says..."); 
     }; 
     result.prototype = new Cow(); 
     return new result; 
    } 
}; 

new Foo.Bar().talk(); 
0
var Foo = { 
    Bar: function() { 
     //... 
     return this; // technically unnecessary, implied by 'new' operator 
    } 
}; 

Foo.Bar.prototype = new Cow(); // the secret sauce 

dive = new Foo.Bar(); 

dive.moo(); // moo's like a Cow 
0

如果你想封裝Foo.Bar.prototype =你能做到這一點不改變默認的構造函數的行爲:

function Cow() { 
    this.talk = function() { 
    alert("mooo") 
    } 
} 

var Foo = { 
    Bar: function() { 
    var constructor = function() { 
     this.eat = function() { 
     alert("gulp") 
     } 
    } 
    constructor.prototype = new Cow() 
    return constructor 
    }() 
} 

var foo = new Foo.Bar() 
foo.talk() 
foo.eat()