我对 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){....}
这是唯一的方法还是我做错了什么?
最佳答案
函数是对象的属性(它们是一等值),因此它们像任何其他属性一样出现在 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
.
最后,如果您不需要将函数定义为 closures您可以在对象的原型(prototype)上定义它们,在这种情况下 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
关于Javascript 将对象作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10723749/