8

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

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

请注意,如果您执行此操作,您将从console.logGoogle Chrome 中的命令获得“simpleFunction”输出。(我正在使用 19.0.1084.46m 。)

但是,种类繁多的相关 Object 函数不会传递给console.log.

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

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

4

4 回答 4

14

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

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

Crockford 提倡使用Object.prototype.hasOwnProperty而不是tempObject.hasOwnProperty,以防万一您hasOwnProperty在对象中覆盖。


在 ES5 中,您可以将其设置为 not 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);
});
于 2012-05-22T03:57:47.877 回答
0

你的意思是这样的:

for (var temp in tempObject) {
    if (tempObject.hasOwnProperty(temp )) {
         console.log(temp);
    }
}
于 2012-05-22T03:57:48.773 回答
0

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

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

底线是,如果不使用in.

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

function simpleFunction(obj) {
}
于 2012-05-22T03:58:47.350 回答
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
}
于 2012-05-22T04:04:39.670 回答