2

私はjavascriptが初めてで、いくつかの異なることを試しています。次の例を見てください。

function obj(){
    this.execute = function(codeToExecute){
        codeToExecute();
    }
}

// Object init and function call

var obj = obj();
obj.execute(function(){
    alert("G'Day!");
}

これにより、メッセージが実行されalertます。今まではすべて問題ありませんでしたが、今はalertパラメーターを介してメッセージを送信しようとしています:

var obj = obj();
obj.execute(function(message){
    alert(message);
}

function obj()そのパラメータをどこかに挿入しなければならない今の構造はどうあるべきですか?

正直なところ、何を探しているのか正確にわからないため、Googleで役立つものを見つけることができませんでした。ありがとうございました!

4

3 に答える 3

4

execute追加のパラメーターが提供された関数に渡されるように拡張できます。

function Obj() {
    this.execute = function(f) {
        var args = [].slice.call(arguments, 1);
        f.apply(this, args);
    }
}

var obj = new Obj();
obj.execute(function(message){
    alert(message);
}, "boo!");

この行は「魔法の」行です。

var args = [].slice.call(arguments, 1);

配列のコピーに使用Array.prototype.sliceされる関数を使用しますが、(一種の)関数をだましてarguments(提供されたものではなく)ソース配列として疑似配列を使用[]し、最初の要素を除くすべての要素をコピーします。

は実際のJS配列ではないarguments.slice(1)ため、単に使用することはできません。プロパティがあり、アクセスできますが、実際の配列にあるような追加の関数がすべて含まれているわけではありません。の実装はそれ以上のことを知りませんが、それは十分に近いです。arguments.lengtharguments[n]prototype.slice()

注意:newオブジェクトインスタンスを作成するために使用する必要があります-元のコードでは、すぐに呼び出し obj()てから(未定義の)結果を再割り当てしobjます-そのコードはまったく機能しませんでした。

于 2012-05-17T08:20:57.853 に答える
2

次のように実行できます。

function obj(){
 this.execute = function(codeToExecute, arg){
     codeToExecute(arg);
   }
} 

var obj = new Obj(); 
obj.execute(function(message){
               alert(message);},
           "yourmessage");

基本的に、2 つの引数を obj.execute に渡します: 関数とその関数への引数です。

于 2012-05-17T08:28:55.930 に答える
1

古き良き set/get メソッドを使用できます。以下では、メッセージをオブジェクト コンストラクターに渡し、getMessage関数でアクセスできます。コンストラクターに渡したくない場合は、 set 関数を含めることができます

function Obj(message){
this.getMessage = function(){
return message;
}
    this.execute = function(codeToExecute){
        codeToExecute();
    }
}

var obj = new Obj("hello");
obj.execute(function(){
    alert(obj.getMessage());
});
于 2012-05-17T08:38:52.697 に答える