向Object原型添加函数会导致函数显示在所有'for OB in OBJ'循环中

时间:2012-05-22 03:53:45

标签: javascript

所以,这里有一些示例javascript代码:

Object.prototype.simpleFunction = function () {
    return true;
}
var tempObject = {};
for (var temp in tempObject) {
    console.log(temp);
}

请注意,如果执行此操作,您将从Google Chrome中的console.log命令获得'simpleFunction'输出。 (我使用的是19.0.1084.46m。)

但是,各种相关的Object函数 not 传递给console.log

如何在Object原型中添加函数而不将它们显示在我的“for property in对象”循环中?

编辑:我应该提到我想要的最后一件事是在那里抛出另一个'if'语句,因为它意味着我需要将它添加到所有{{1循环。 :(

4 个答案:

答案 0 :(得分:11)

这就是为什么你应该经常检查hasOwnProperty

for (var temp in tempObject) {
    if (Object.prototype.hasOwnProperty(tempObject, temp)) {
        console.log(temp);
    }
}

Crockford主张使用Object.prototype.hasOwnProperty代替tempObject.hasOwnProperty,以防您在对象中覆盖hasOwnProperty


在ES5中,您可以将其设置为enumerable

Object.defineProperty(Object.prototype, 'simpleFunction', {
    value: function() {
        return true;
    },
    enumerable: false, // this is actually the default
});

或者(在ES5中),您可以使用Object.keys()仅获取对象自己的键:

Object.keys(tempObject).forEach(function(key) {
    console.log(key);
});

答案 1 :(得分:0)

你的意思是:

for (var temp in tempObject) {
    if (tempObject.hasOwnProperty(temp )) {
         console.log(temp);
    }
}

答案 2 :(得分:0)

您可以通过执行以下操作跳过继承的属性:

if (tempObject.hasOwnProperty(temp)) {
    // property didn't come from the prototype chain
}

最重要的是,你不能在没有使用in进行迭代的情况下为原型添加函数。

您可以定义一个总是传递对象的外部接口,例如

function simpleFunction(obj) {
}

答案 3 :(得分:0)

在javascript中无法执行此操作。您需要自己过滤结果。一种可能的方法是在另一个对象中定义自己的原型属性:

var myObjectExt = {
    sampleFunciton: function(){}
}
var p;
for(p in myObjectExt){
    Object.prototype[p] = myObjectExt[p];
}

var obj = {};
for(p in obj){
    if(myObjectExt[p])continue;
    //do what you need
}