为什么hasOwnProperty别名错误地返回undefined?

时间:2011-07-03 13:05:48

标签: javascript

function object() {
    var F = function() {};
    F.prototype = {
        alias: {},
        hasOwnProperty: function() { return false; },
        hasProperty: function(obj, prop) {
            for (var i = 0; i < obj.length; i++) {
                if (obj[i] !== prop) return false;
                else if (obj[i] === prop) return true;
                else return undefined;
            }
        }
    };
    return new F();
}

var newObj = object();
newObj.alias.msg = "Hello";
console.log(newObj.hasProperty(newObj.alias, "Hello"));

它为newObj.hasProperty返回undefined(newObj.alias,“Hello”)。为什么呢?

2 个答案:

答案 0 :(得分:1)

这很可能是因为你正在迭代一个对象,就像你在迭代一个数组一样。

for循环从不循环任何东西,因为对象没有length属性,并且没有按数字索引。

您需要使用for-in循环:

for(var key in obj) {
    //key will contain the name of the property, and obj[key] the value
    if(key === blah) ...
}

答案 1 :(得分:0)

嗯,首先,alias是一个普通对象,因此没有可用于.length循环的for属性。

如果你放置:

console.log(i);

...在你的for循环中,你会注意到你从未真正运行过阻止。

即使你修复了循环,你仍然在第一个枚举中执行return,所以如果你正在测试的属性不在循环中,那么你将得到一个不正确的结果

最终,您将无法使用循环复制hasOwnProperty()的行为,因为prototype将包含在枚举中。