2011-07-03 8 views
0
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(newObj.alias、 "Hello")には未定義が返されます。どうして?hasOwnPropertyエイリアスが誤ってundefinedを返すのはなぜですか?

答えて

0

まあ、あるものの、aliasは普通のオブジェクトなので、forループに使用できる.lengthプロパティはありません。

あなたが置いた場合:

console.log(i); 

を...あなたのforループで、あなたが実際にブロックを実行しないことに気づくでしょう。

ループを修正しても、最初の列挙でまだreturnを実行しています。したがって、テストしているプロパティが最初にループ内になければ、間違った結果になります。

最終的にhasOwnProperty()の動作をループで複製することはできません。これはprototypeが列挙に含まれるためです。

1

これは、配列を繰り返し処理しているかのようにオブジェクトを反復している可能性が高いためです。

for-loopは何もループしません。なぜなら、オブジェクトはlengthプロパティを持たず、numberでインデックス付けされていないからです。

あなたがのために、ループを使用する必要があります。

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