0

私は基本的に、関数自体の中に関数のプロトタイプを設定しようとしています。目的は、多くの関数を 1 つのパブリック関数内に隠しながら、機能を維持することです。

jsFiddleの動作しないコードを次に示します。意図された動作は、「Greetings!」を表示することです。と「私をあなたのリーダーに連れて行ってください」。

Outer.prototypeコードは、行とExtensions関数Outerを関数からグローバル スコープに移動することで「修正」できます。ただし、これはExtensions関数が公開されており、直接使用するために無料であることを意味しますが、そうであってはなりません。

この「プライベートな」動作を達成するための良い方法は何でしょうか?

4

1 に答える 1

1

プロトタイプをオーバーライドしているため、これは機能しません。を呼び出すとnew Outer現在のthisから継承されます。その後、関数内でオーバーライドしていますが、現在作成されているインスタンスには影響せず、将来のインスタンスにのみ影響します。既存のプロトタイプ を拡張する必要があります。 Outer.prototypeObject.prototype

ただし、特定の関数を非表示にする場合は、自己呼び出し関数を使用します。

var Outer = (function() {

    function Extensions() {
    }
    Extensions.protoype.Greet = function () {
        alert(this.Greetings);
    }

    function Inner() {
        Extensions.call(this);
        this.Greetings = "Take me to your leader.";
    }
    Inner.prototype = Object.create(Extensions.prototype);
    Inner.prototype.constructor = Inner;

    function Outer() {
        Extensions.call(this);
        this.Greetings = "Greetings!";
    }
    Outer.prototype = Object.create(Extensions.prototype);
    Outer.prototype.constructor = Outer;

    Outer.prototype.getInner = function() {
        return new Inner();
    };

    return Outer;

}());

ここで、Extensionsは即時実行関数内で定義されます。そのため、外部からはアクセスできません。その関数から返すOuterので、アクセスできます。

JavaScriptで正しく行われた継承の非常に良い説明については、この回答を参照してください。

于 2012-06-25T22:41:09.133 に答える