2011-07-22 20 views
0

原型継承

var dive = new Foo.Bar(); 

そしてFoo.Barは次のようになります。

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

しかし私は、他のすべてのプロトタイプを持っているdiveが好きで、既存のオブジェクトと思います。のは、window.Cow.prototypeを言ってみましょうすることです:私はこれを行うことができるようにFoo.Barに何をする必要がありますどのような

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

:ここ

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() 
関連する問題