Rozważać:
if (someVar.hasOwnProperty('someProperty') ) {
// Do something();
} else {
// Do somethingElse();
}
Jakie jest właściwe użycie / wyjaśnienie hasOwnProperty('someProperty')
?
Dlaczego nie możemy po prostu użyć someVar.someProperty
do sprawdzenia, czy obiekt someVar
zawiera właściwość o nazwie someProperty
?
Czym jest nieruchomość w tym przypadku?
Jaką właściwość sprawdza ten JavaScript?
javascript
object
hasownproperty
LATAĆ
źródło
źródło
Odpowiedzi:
hasOwnProperty
zwraca wartość logiczną wskazującą, czy obiekt, dla którego go wywołujesz, ma właściwość z nazwą argumentu. Na przykład:var x = { y: 10 }; console.log(x.hasOwnProperty("y")); //true console.log(x.hasOwnProperty("z")); //false
Jednak nie patrzy na łańcuch prototypów obiektu.
Przydaje się, gdy wyliczasz właściwości obiektu za pomocą
for...in
konstrukcji.Jeśli chcesz zobaczyć wszystkie szczegóły, specyfikacja ES5 jest, jak zawsze, dobrym miejscem do obejrzenia.
źródło
window
eval
kod, a nie kod globalny lub kod funkcji). Wypróbowałem to na pustej stronie HTML i otrzymałem błąd „nie można przekonwertować wartości null na obiekt”.Oto krótka i precyzyjna odpowiedź:
W JavaScript każdy obiekt ma kilka wbudowanych par klucz-wartość, które zawierają metainformacje o obiekcie. Kiedy przeglądasz wszystkie pary klucz-wartość za pomocą
for...in
konstrukcji / pętli dla obiektu, również przechodzisz przez te pary klucz-wartość metainformacji (których zdecydowanie nie chcesz).Używając
hasOwnPropery(property)
filtrów eliminuj te niepotrzebne pętle przez metainformacje i bezpośrednio sprawdza, czy parametrproperty
jest właściwością podaną przez użytkownika w obiekcie, czy nie. Przez filtrowanie mam na myśli to, żehasOwnProperty(property)
nie wygląda na to, żeproperty
istnieje w łańcuchu prototypów Object, czyli metainformacjach.Na tej
true/false
podstawie zwraca wartość logiczną .Oto przykład:
var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"}; console.log(fruitObject.hasOwnProperty("name")); //true console.log(Object.prototype.hasOwnProperty("toString");) //true because in above snapshot you can see, that there is a function toString in meta-information
Mam nadzieję, że to jasne!
źródło
console.log(Object.prototype....
; pan miał na myśliconsole.log(fruitObject.
? fruitObject czy Object?for (var key in fruitObject) { ... }
js tylko cyklicznie przez klucze inne niż prototypowe, czy coś mi brakuje lub czy środowisko wykonawcze JS zmieniło sposób, w jaki obsługuje klucz w obiekcie pętle?Sprawdza:
Zwraca wartość logiczną wskazującą, czy obiekt ma właściwość o określonej nazwie
Metoda hasOwnProperty zwraca wartość true, jeśli obiekt ma właściwość o określonej nazwie, false, jeśli jej nie ma. Ta metoda nie sprawdza, czy właściwość istnieje w łańcuchu prototypów obiektu; właściwość musi należeć do samego obiektu.
Przykład:
var s = new String("Sample"); document.write(s.hasOwnProperty("split")); //false document.write(String.prototype.hasOwnProperty("split")); //true
źródło
Podsumowanie:
hasOwnProperty()
jest funkcją, którą można wywołać na dowolnym obiekcie i pobiera ciąg znaków jako dane wejściowe. Zwraca wartość logiczną, która oznaczatrue
, że właściwość znajduje się na obiekcie, w przeciwnym razie zwraca wartość false.hasOwnProperty()
znajduje się naObject.prototype
i dzięki temu jest dostępny dla każdego obiektu.Przykład:
function Person(name) { this.name = name; } Person.prototype.age = 25; const willem = new Person('willem'); console.log(willem.name); // Property found on object console.log(willem.age); // Property found on prototype console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself
W tym przykładzie tworzony jest nowy obiekt Person. Każda osoba ma własną nazwę, która jest inicjalizowana w konstruktorze. Jednak wiek nie znajduje się na obiekcie, ale na prototypie obiektu. Dlatego
hasOwnProperty()
wracatrue
po imię ifalse
wiek.Praktyczne zastosowania:
hasOwnProperty()
może być bardzo przydatne podczas wykonywania pętli po obiekcie za pomocąfor in
pętli. Możesz za jego pomocą sprawdzić, czy właściwości pochodzą z samego obiektu, a nie z prototypu. Na przykład:function Person(name, city) { this.name = name; this.city = city; } Person.prototype.age = 25; const willem = new Person('Willem', 'Groningen'); for (let trait in willem) { console.log(trait, willem[trait]); // This loops through all properties, including the prototype } console.log('\n'); for (let trait in willem) { if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object console.log(trait, willem[trait]); } }
źródło
Używasz object.hasOwnProperty ( p ) do określenia, czy obiekt ma wyliczalną właściwość p -
Obiekt może mieć własny prototyp, w którym do każdej instancji obiektu przypisane są „domyślne” metody i atrybuty. hasOwnProperty zwraca wartość true tylko dla właściwości, które zostały specjalnie ustawione w konstruktorze lub dodane do wystąpienia później.
Aby określić, czy p jest w ogóle zdefiniowane w dowolnym miejscu dla obiektu, użyj if ( p instanceof object), gdzie p jest wynikiem łańcucha nazwy właściwości.
Na przykład domyślnie wszystkie obiekty mają metodę „toString”, ale nie pojawi się ona w hasOwnProperty.
źródło
hasOwnProperty to normalna funkcja JavaScript, która przyjmuje argument w postaci ciągu.
W twoim przypadku
somevar.hasOwnProperty('someProperty')
sprawdza, czysomevar
funkcja ma,somepropery
czy nie - zwraca prawdę i fałsz.Mówić
function somevar() { this.someProperty = "Generic"; } function welcomeMessage() { var somevar1 = new somevar(); if(somevar1.hasOwnProperty("name")) { alert(somevar1.hasOwnProperty("name")); // It will return true } }
źródło
hasOwnProperty
jest właściwym sposobem sprawdzenia, czy obiekt ma właściwość, czy nie.someVar.someProperty
nie może być alternatywą dla tej sytuacji. Następujący stan pokaże dobrą różnicę:const someVar = { isFirst: false }; // The condition is true, because 'someVar' has property 'isFirst' if (someVar.hasOwnProperty('isFirst')) { // Code runs } // The condition is false, because 'isFirst' is false. if (someVar.isFirst) { // Code does not runs here }
W związku z tym
someVar.isFirst
nie można używać alternatywy dlasomeVar.hasOwnProperty('isFirst')
.źródło
Scena A:
const objA = { a: 1, b: 2 } for (const key in objA) { if (objA.hasOwnProperty(key)) { console.log(objA[key]) } } Output 1 2
Scena B:
const objB = { a: 1, b: 2, hasOwnProperty() { return false } } for (const key in objB) { if (objB.hasOwnProperty(key)) { console.log(objB[key]) } } Outputs nothing
Ponieważ JavaScript nie chroni właściwości hasOwnProperty. Możesz więc używać tego w następujący sposób:
for (const key in objB) { if (Object.prototype.hasOwnProperty.call(obj, key)) { console.log(objB[key]) } }
źródło
To sprawdza, czy obiekt ma właściwość . Działa tak samo jak
if(obj.prop)
, o ile wiem.źródło
obj.prop
podąża za łańcuchem prototypów,hasOwnProperty
nieprop
ma fałszywą wartość.if(obj.hasOwnProperty('prop'))
będzie,true
dopókiif(obj.prop)
będziefalse
.