1

次のスクリプトを参照してください。

var x = function(param){
    this.data=param;

    this.y = function(){
        alert(this.data)
    }

    return this;
}

/*
    x.prototype.z = function(){
        alert(this.data);
    }
*/

x(123).y();
x(123).z(); // This should behave same as y()

x(123).y()を呼び出すと、メッセージに123が表示されます。x()内で宣言された関数y( )

ここで、 x()の外部にあるが、 y()と同じように動作する別の関数z()を宣言したいと思います[ x()に関連付けます]

出来ますか?可能であればどのように?

4

3 に答える 3

3

newを呼び出すときにがありませんx()。それ以外の場合、this関数本体内ではwindow、のインスタンスではなく、グローバルオブジェクト(ブラウザコンテキスト内)を参照しますx

z()これが、 (コードのコメントを外した後の)呼び出しが機能しない理由です。呼び出しy()は、グローバル変数を作成するときに偶然にのみ機能します。グローバル変数dataの値は、の次の呼び出しによって上書きされますx()


私はあなたが何を達成しようとしているのか分かりません、そして私が見ることができることから、それはおそらく良い考えではありません。newとにかく、オブジェクトを作成するときに明示的なものを取り除く方法の例を次に示します。

var x = function(param){
    // add missing `new`:
    if(!(this instanceof x))
        return new x(param);

    this.data=param;

    this.y = function(){
        alert(this.data)
    }
}


x.prototype.z = function(){
    alert(this.data);
}

x(123).y();
x(456).z();
于 2009-10-05T08:17:21.490 に答える
1

それは可能であり、 sのz作成方法を修正すれば、コメントアウトされた関数はそのまま機能するはずです。x

インスタンスプロパティ(コードでは宣言されている)のみを処理している場合は、コンストラクター内で関数yを宣言する必要はなく、宣言するとかなりのメモリコストがかかることに注意してください(すべてのインスタンスがその関数の独自のコピーを取得します)。コストがかかることを考えると、主要なデータ隠蔽の理由で絶対に必要な場合にのみ、これを実行する必要があります。

編集:申し訳ありませんが、私は何かを逃しました:あなたはnewキーワードを逃しています、あなたの例は次のようになります:

new x(123).y();
new x(123).z();

...そしてコンストラクターはを返さないはずthisです。

完全な例:

var x = function(param) {

    this.data=param;

    // Doesn't have to be in the constructor, and you should
    // avoid it unless you're doing something with major
    // data hiding a'la Crockford
    this.y = function() {
        alert(this.data)
    }
}

x.prototype.z = function() {
    alert(this.data);
}

new x(123).y();
new x(123).z();

これは私が上で述べたCrockfordの記事ですが、繰り返しになりますが、これはメモリに大きな影響を及ぼします。

于 2009-10-05T08:15:06.843 に答える
0
function generator( param ) {
    this.data = param;
    this.y = function() {
        alert( this.data )
    }
}

generator.prototype.z = function() {
    alert( this.data );
}

x = new generator( 3 );
x.y()
x.z()

これが必要かどうかはわかりませんが、これはgeneratorオブジェクトを返すという名前のコンストラクターであり、その外部でnewキーワードを使用してプロトタイプメソッドが定義されています。

他の人が述べたように:

  • thisコンストラクターに戻る必要はありません
  • newあなたはそれをキーワードで呼びます
  • で宣言されたすべてのメソッドは、使用しthisない限りパブリックになります。使用varする場合はプライベートになります
于 2009-10-05T08:29:31.680 に答える