2012-07-03 12 views

Odpowiedz

11

Jeśli tworzysz podstawowy obiekt z {}, lub otrzymujesz go z JSON przy użyciu JSON.Parse, hasOwnProperty jest globalnie bezużyteczny.

Ale jeśli rozszerzasz (używając prototypu) "klasę", to pomaga ci wiedzieć, czy uzyskujesz dostęp do "własnych właściwości" (właściwości bezpośrednie, w tym funkcje bezpośrednie).

Należy zauważyć, że podstawowym celem ma co najmniej jeden (nie bezpośrednio) właściwość, że można dowiedzieć się z console.log({}); lub console.log({}.toString) ale it's not enumerable and not seen w for... in pętli:

FOR ... w pętli nie iteracyjne nad własnościami nieprzeliczalnymi. Obiekty utworzone za pomocą wbudowanych konstruktorów, takich jak Array i Object, mają odziedziczone właściwości nieprzeliczalne z Object.prototype i String.prototype, które nie są przeliczalne, na przykład String's indexOf lub metoda ToString obiektu. Pętla będzie iterować nad wszystkimi przeliczalnymi właściwościami obiektu lub dziedziczy po prototypie konstruktora (włącznie z wszystkimi, które nadpisują wbudowane właściwości ).

+2

'hasOwnProperty' nie jest bezużyteczne i konieczne, gdy nie masz pełnej kontroli nad kodem Twoja strona. Powiedzmy, że ktoś modyfikuje "Object.prototype" jako odpowiedź Cristopola ...nawet z prostym obiektem otrzymasz nieprzewidywalne wyniki bez 'hasOwnProperty'. – Radu

+0

Powiedziałbym, że kłamliwy kod, który nie posiada pełnej kontroli, jest inną kategorią niż * tworzenie podstawowego obiektu za pomocą {} lub pobieranie go z JSON * –

10

Bez numeru hasOwnProperty nie wiadomo, czy właściwość jest rodzimą własnością obiektu, czy odziedziczoną po jego prototypie.

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 
​ 

W tym przypadku obj1 dziedziczy nieruchomość c z niego jest Prototype Object i może błędnie wymienić go w pierwszej pętli.

1

Często uzyskuje się ten sam wynik z lub bez hasOwnProperty, ale drugi ignoruje właściwości, które są dziedziczone, a nie żyją bezpośrednio na danym obiekcie.

Rozważmy ten podstawowy system dziedziczenia. Psy dziedziczą po mistrzowskiej klasie Animal.

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'}); 

Jeśli zajrzeć do fido, hasOwnProperty pomaga nam ustalić, które mają swoje własne właściwości (nazwa) i które są dziedziczone.

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

... alarmuje name=Fido ale nie is_animal=true.

Powiązane problemy