2012-07-03 51 views

回答

11

如果您要創建一個基本對象與{},或使用JSON.Parse得到它從JSON,hasOwnProperty是全球沒用。

但如果你擴展(使用原型)一個「類」,那麼它可以幫助你知道,如果你訪問你的「自己的屬性」(直接的屬性,包括直接的功能)。

注意一個基本的對象至少有一個(不是直接)屬性,你可以用console.log({});console.log({}.toString)it's not enumerable and not seenfor... in環發現:

一種... in循環不會遍歷通過不可枚舉的屬性。 從內置構造函數(如Array和Object)創建的對象具有 從Object.prototype繼承的不可枚舉屬性和 String.prototype不可枚舉,如String的indexOf 方法或Object的toString方法。該循環將遍歷對象的所有 枚舉的屬性,或者它從 構造函數的原型繼承(包括任何其覆蓋操作內置 屬性)。

+2

'hasOwnProperty'不是無用的,必要的時候你沒有完全控制的代碼你的頁面。就像Cristoph的回答中說的,有人修改Object.prototype。即使是一個簡單的對象,如果沒有'hasOwnProperty',你將得到不可預知的結果。 – Radu

+0

我想說,你沒有完全控制的混亂代碼與*用{}創建一個基本對象或者從JSON * –

10

沒有hasOwnProperty你不知道該屬性是你的對象的本地屬性還是繼承它的原型。

Your modified fiddle

var obj1 = {a:"10",b:"20"}; 

Object.prototype.c = "prototype:30"; 

var i; 
for(i in obj1) { 
    document.getElementById("div1").innerHTML += obj1[i]+" "; 
} 
// result 10 20 prototype:30 

for(i in obj1) { 
    if(obj1.hasOwnProperty(i)) { 
     document.getElementById("div2").innerHTML += obj1[i] +" "; 
    }   
} 
// result 10 20 
​ 

在這種情況下obj1從它繼承的財產c的原型Object,你會錯誤地列出它在你的第一個循環。

1

通常你會得到相同的結果,有或沒有hasOwnProperty,但後者會忽略繼承的屬性,而不是直接在有問題的對象上生存。

考慮這個基本的繼承系統。狗從主動物類繼承。

function Animal(params) { this.is_animal = true; } 
function Dog(params) { for (var i in params) this[i] = params[i]; } 
Dog.prototype = new Animal(); 
var fido = new Dog({name: 'Fido'}); 

如果我們窺視fidohasOwnProperty幫助我們確定這是自己的屬性(名稱)和繼承。

for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]); 

...提醒name=Fido但不is_animal=true