【问题标题】:Javascript passing object as function parameterJavascript将对象作为函数参数传递
【发布时间】:2012-05-30 05:25:28
【问题描述】:

我对 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){....}

这是唯一的方法还是我做错了什么?

【问题讨论】:

  • 是的,您的测试功能在执行您不想要的操作时是错误的。你能把它贴出来吗,这似乎对这个问题很重要?
  • 同意......如果没有看到test() 的代码,就不可能说出发生了什么。
  • 如您所见,它可以正常工作jsfiddle.net/GhNmK/1。因此,正如 Bergi 所说,您的测试功能是有原因的
  • 测试函数只是一个 jquery ajax 调用,如下所示: function test(data){ var result; $.ajax({ url:url, data:data, type:'POST', dataType:dType, async:false, success:function(value){result=value;} });返回结果; }

标签: javascript function object parameter-passing


【解决方案1】:

函数对象的属性(它们是一等值),因此它们像任何其他属性一样出现在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

【讨论】:

  • 感谢您的解释。我将尝试原型定义方法。我选择闭包是因为在我看来它更干净。
猜你喜欢
  • 2018-02-23
  • 2012-06-12
  • 2019-08-29
  • 2012-03-07
  • 2014-06-07
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多