2012-05-23 50 views
0

我对JavaScript很新,所以也许这是一个愚蠢的错误。 我创建像follwing对象: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){....} 

的问题是,当我叫试验(+),我得到的在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){....} 

是它唯一的出路还是我做错了什么?

+3

是,你的测试功能是错误的,当它做你不想要的东西。你可以发布它,这似乎是至关重要的问题? – Bergi

+0

同意......没有看到test()的代码,所以不可能说出发生了什么。 – Pointy

+0

正如你可以看到那里,它正常工作http://jsfiddle.net/GhNmK/1/。所以你的测试函数的原因如上所述Bergi –

回答

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.definePropertyObject.defineProperties的文档。

最后,如果你不需要定义功能closures您可以在对象的原型在这种情况下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 
+0

谢谢你的解释。我会尝试原型定义方法。我选择关闭,因为它在我看来更加干净。 – DarioD

相关问题