Javascript 为什么hasOwnProperty别名错误地返回undefined? 函数对象(){ var F=函数(){}; F.原型={ 别名:{}, hasOwnProperty:function(){return false;}, hasProperty:函数(对象、属性){ 对于(变量i=0;i

Javascript 为什么hasOwnProperty别名错误地返回undefined? 函数对象(){ var F=函数(){}; F.原型={ 别名:{}, hasOwnProperty:function(){return false;}, hasProperty:函数(对象、属性){ 对于(变量i=0;i,javascript,Javascript,它返回newObj.hasProperty(newObj.alias,“Hello”)的未定义值。为什么?首先,别名是一个普通对象,因此没有可用于for循环的.length属性 如果您放置: function object() { var F = function() {}; F.prototype = { alias: {}, hasOwnProperty: function() { return false; }, hasPro

它返回newObj.hasProperty(newObj.alias,“Hello”)的未定义值。为什么?

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

如果您放置:

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"));
…在
for
循环中,您会注意到您从未实际运行过块

即使修复了循环,在第一次枚举中仍会执行
返回
,因此如果要测试的属性不是循环中的第一个,则会得到错误的结果


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

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

for循环根本不会循环任何东西,因为对象没有length属性,也不按数字索引

您需要使用for in循环:

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