0

私はJavaScriptにかなり慣れていないので、ばかげたエラーかもしれません。次のようなオブジェクトを作成しました。

function objA(){
    this.prop1;
    this.prop2;
    this.prop3;
    this.func1=function(){
        alert('func1');
    }
    this.func2=function(){
        alert('func2');
    }
}

オブジェクトを渡したい関数があります:

var foo=new objA;

function test(foo){....}

問題は、test() を呼び出すと、objA (objA.func1 および objA.func2) の関数が実行されることです。objA のプロパティ値を取得したいだけです。別の関数と配列を使用し、配列に objA のプロパティを入力してから、配列を渡す必要があります。

var arrayA={}

function fillArray(data){
    arrayA.prop1=data.prop1;
    arrayA.prop2=data.prop2;
    arrayA.prop3=data.prop3;
}

function test(arrayA){....}

それが唯一の方法ですか、それとも何か間違っていますか?

4

1 に答える 1

2

関数オブジェクトのプロパティ (第一級の値) であるため、for (var propName in myObj)他のプロパティと同様にループ内に表示されます。次の方法で、それらをさらに調べることを避けることができます。

for (var prop in myObj){
  if (!myObj.hasOwnProperty(prop)) continue; // Skip inherited properties
  var val = myObj[prop];
  if (typeof val === 'function'))  continue; // Skip functions

  // Must be my own, non-function property
}

または、最新のブラウザーでは、特定のプロパティ (関数など)を列挙不可にfor ... inすることができるため、ループに表示されません。

function objA(){
  this.prop1 = 42;
  Object.defineProperty(this,'func1',{
    value:function(){
     ...
    }
  });
}

詳細については、Object.definePropertyまたはのドキュメントを参照してくださいObject.defineProperties

最後に、関数をクロージャーとして定義する必要がない場合は、オブジェクトのプロトタイプでそれらを定義できます。その場合、hasOwnPropertyテストによってそれらがスキップされます。

function objA(){
  this.prop1 = 42;
}
objA.prototype.func1 = function(){
  // operate on the object generically
};

var a = new objA;
"func1" in a;              // true
a.hasOwnProperty("func1"); // false
于 2012-05-23T16:09:48.240 に答える