对于var in对象返回方法以及属性

时间:2014-08-01 10:02:24

标签: javascript object for-in-loop

我已经尝试了以下代码,并且惊讶地发现对象中的var也返回了对象方法。 我不确定为什么会发生这种情况,对象方法本质上是属性吗? 有没有办法让它只返回包含值的属性?

var object = {p1: 1, p2: 2, p3: 3};

    object.funkcja = function() {
        for (var x in object) {document.getElementById("test").innerHTML += object[x] + "<BR>";}
    };

示例:

4 个答案:

答案 0 :(得分:0)

像波纹管一样检查应该有效。

for (var x in object) {
    if(object.hasOwnProperty(x)){
        document.getElementById("test").innerHTML += object[x] + "<BR>";
    }

}

答案 1 :(得分:0)

这是因为JavaScript不会在值和方法之间产生差异。 您必须自己从值中过滤方法。 我建议你在循环中使用这个函数:How can I check if a javascript variable is function type?

for (var p in object){
    if(isFunctionA(p) == false){
        //Make your work on props here.
    }
}
function isFunctionA(object) {
 return object && getClass.call(object) == '[object Function]';
}

答案 2 :(得分:0)

是的,对象的方法只是碰巧是函数的属性。您可以使用

测试属性是否为函数
 if(typeof object[x] === 'function')

 if(object[x] instanceof Function)

我相信instanceof运算符效率稍高,但如果你有多个全局上下文有效(例如,如果你在不同的帧之间传递对象),它可能无法工作。

值得注意的是,for in循环将返回在对象原型上定义的属性及其实例属性。为避免这种情况,您可以使用

 if(object.hasOwnProperty(x))

答案 3 :(得分:0)

我认为这是正确的方法:

for (var x in object) {
    if(object.hasOwnProperty(x) && !(object[x] instanceof Function) ){
        document.getElementById("test").innerHTML += object[x] + "<BR>";
    }
}