3

関数からプロトタイプ化された独自の関数にオブジェクトを渡すにはどうすればよいですか?

function Main()
{
    this.my_object = {"key":123};
}

Main.prototype.Sub = new Sub(this.my_object);

function Sub(obj)
{
    alert(obj);
}

Main.Sub; //this should alert the object created in Main()

フィドル: http://jsfiddle.net/GkHc4/

編集1:

関数のチェーンを作成しようとしていますが、各リンクは前のオブジェクトを取得して何かを追加する必要があります。この時点で実験です。例えば:

Main.Link1.Link2.link3();

//link3 it's a prototype for link2
//link2 it's a prototype for link1
//and so on...

各リンクが初期オブジェクトにキーを追加する場所

4

3 に答える 3

2

次の 3 つの異なる問題があります。

1) でオブジェクトを作成せず、コンストラクターから直接プロパティnew Main()にアクセスしようとします。Subこれはうまくいきません。インスタンスを作成する必要があります。

var main = new Main();
main.Sub; //<-- now you can access it 

my_object2) を使用してプロパティにアクセスしようとしていますthisが、関数の外部にあります。それもうまくいきません。thisおそらく、 というプロパティを持たない window オブジェクトを指しますmy_object。解決策は書くことかもしれませんmain.my_objectが、それはプロトタイプの目的を台無しにしてしまいます。通常、すべてのインスタンスに同じ関数またはプロパティを配置します。しかし、インスタンスごとに異なるプロパティをそこに入れようとしています。したがって、プロトタイプにまったくアクセスする必要はないように見えますが、通常のプロパティとして定義するだけで済みます。

function Main()
{
    this.my_object = {"key":123};
    this.Sub = new Sub(this.my_object);
}

3) 行main.Subは何も実行しません。プロパティをリクエストしているだけSubです。代わりに、Sub書き込み時に関数が実行されますnew Sub(...)。したがって、関数を呼び出して何かを警告したい場合は、関数を定義する必要があります。たとえば、アラート メソッドを inSubまたは inで定義してSub.prototypeから、このメソッドを呼び出すことができます。

function Sub(obj)
{
    this.alert() {
        alert(obj);
    }
}

main.Sub.alert();

更新されたフィドル

于 2013-07-25T22:43:50.457 に答える
1

私はあなたが間違った方法でそれを行っていると思います..あなたが見る:

  • 「新しいサブ」を実行すると、アラートは最後の行からではなく、実際にはプロトタイプ行から発生します。

たぶん、より良いアプローチは次のようなものになるでしょう:

function Main()
{
    this.my_object = {"key":123};
}

Main.prototype.Sub =  Sub; //You set the prototype, but don't actually execute the function

function Sub(obj)
{
    alert(obj);
}

var m = new Main(); //You need to create a new object of type Main in order for it to have access to the method Sub
m.Sub(m.my_object); //this should alert the object created in new Main()

これは役に立ちますか?

編集

さらに、 Sub 関数に対して次のようなことを行うこともできます。

function Sub() {
   alert(this.my_object);
}

ただし、その場合、関数を単独で使用することはできません。

于 2013-07-25T22:33:19.480 に答える