2016-07-01 8 views
5

オブジェクトのプロトタイプを別のオブジェクトで公開する方法はありますか?このコードでオブジェクトのプロトタイプを公開する

var foo = function() { 
    var foo = { 
     bar: bar, 
     boo: boo 
    } 
    return foo; 

    function bar (age) { 
     this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
    } 

    function boo (age) { 
     this.age = age; 
     boo.prototype.shoutAge = function() { 
     alert('My age is ' + this.age); 
     } 
    } 
    } 

    var foo = foo(); 
    var far = new foo.bar(13); // bar {age: 13} 
    far.shoutAge(); // far.shoutAge is not a function 

    var far = new foo.boo(13); // boo {age: 13} with __proto__ 
    far.shoutAge(); // alert('My age is 13'); 

「バー」オブジェクトは、プロトタイプの継承を使用して設定されている - が、バーを露出する「shoutAge」の継承を失います。

しかし、「ブー」目的は、プロトタイプがそれの内で宣言と外部関数、メソッド「shoutAge」にアクセスすることがあります。

後者は、機能してもベストプラクティスではないと思います。では、ここでベストプラクティスは何でしょうか?

私は「バー」のインスタンスの数百人が潜在的に存在している場合は特に、「バー」の各インスタンスは、それが自分の「shoutAge」方法だ持っている必要はありません。通常、別のオブジェクトを'bar'の代わりに作成し、'foo'に公開するのではなく、私はbar.prototype割り当てがあなたのコードで実行されることはありませんので、これがあると思い

var Foo = function() { 

    function bar (age) { 
    this.age = age; 
    } 
    bar.prototype.shoutAge = function() { 
    alert('My age is ' + this.age); 
    } 

    var foo = { 
    bar: bar, 
    boo: boo 
    } 
    return foo; 
} 

:これはちょうどオーダー・オブ・オペレーションの問題であるように

+0

ここで継承はどこですか? 'bar'と' boo'のどちらも 'foo'を継承しません。 –

+0

'far'は' bar.prototype'または 'boo.prototype'から継承します – Oriol

+0

あなたのプログラムをlintingしてみてください。 –

答えて

3

が見えます。 bar関数の定義はhoistedです。したがって、返されるオブジェクトで使用できますが、プロトタイプの割り当てはreturnステートメントの後の追加ステートメントであり、制御フローは決してそれに届きません。 returnを最後まで移動するだけで問題は解決します。

+0

+1、良い説明。 OPが気づいていない場合に備えて、吊り上げが何であるかへのリンクを与える価値があるかもしれません。 –

+0

@OmriAharonが追加されました。 – nrabinowitz

+0

これは私が読んだときにこれが意味を成し遂げました。私は過去に簡単に吊り上げることに遭遇しました。残念ながら、これはまだfar.shoutAgeは関数ではありません。例として[jsfiddle](https://jsfiddle.net/7j8ws41c/1/)があります。 *編集* Nevermind私はこのフィドルで間違ったことを割り当てていましたが、これはうまくいきます。 – amarshall

関連する問題