אובייקט - איך ולמה להשתמש ב-hasOwnProperty ב-JavaScript?
שקול:
if (someVar.hasOwnProperty('someProperty') ) {
// Do something();
} else {
// Do somethingElse();
}
מה השימוש/ההסבר הנכון של hasOwnProperty('someProperty')?
למה אנחנו לא יכולים פשוט להשתמש ב-someVar.someProperty כדי לבדוק אם אובייקט someVar מכיל תכונה בשם someProperty?
מהי נכס במקרה זה?
איזו תכונה הבדיקה הזו ב-JavaScript בודקת?
תשובה #1
hasOwnProperty מחזיר ערך בוליאני המציין האם לאובייקט עליו אתה קורא את הפונקציה יש תכונה בשם הפרמטר. לדוגמה:
var x = {
y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false
עם זאת, זה לא מסתכל על שרשרת הפרוטוטיפ של האובייקט.
זה שימושי להשתמש בו כשמונים את המאפיינים של אובייקט עם מבנה ה-for...in.
אם אתה רוצה לראות את כל הפרטים, המפרט של ES5, כמו תמיד, הוא מקום טוב להסתכל בו.
תשובה #2
הנה תשובה קצרה ומדויקת:
ב-JavaScript, לכל אובייקט יש סט של זוגות מפתח-ערך מובנים שמכילים מידע מטא על האובייקט. כאשר אתה עובר על כל זוגות המפתח-ערך באמצעות מבנה/לולאת for...in עבור אובייקט, אתה למעשה עובר גם על זוגות מפתח-ערך של מידע המטא הזה (שאתה בהחלט לא רוצה).
שימוש ב-hasOwnProperty(property) מסנן החוצה את הלולאות המיותרות דרך מידע מטה ובודק ישירות אם הפרמטר property הוא תכונה שניתנה על ידי המשתמש באובייקט או לא. ב-מסנן החוצה, אני מתכוון לכך ש-hasOwnProperty(property) לא בודק אם property קיים בשרשרת הפרוטוטייפ של האובייקט, כלומר במידע המטה.
זה מחזיר בוליאני true/false בהתאם לכך.
הנה דוגמה:
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אני מקווה שזה ברור!
תשובה #3
סיכום :
hasOwnProperty() היא פונקציה שניתן לקרוא לה על כל אובייקט והיא מקבלת מחרוזת כקלט. היא מחזירה ערך בוליאני שהוא true אם התכונה נמצאת על האובייקט, אחרת היא מחזירה false. hasOwnProperty() נמצאת על Object.prototype ולכן זמינה לכל אובייקט.
דוגמה :
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בדוגמה זו נוצר אובייקט Person חדש. לכל Person יש שם משלו שמאתחל במבנה הבנאי. עם זאת, הגיל לא נמצא על האובייקט עצמו אלא על הפרוטוטייפ של האובייקט. לכן hasOwnProperty() מחזיר true עבור שם ו-false עבור גיל.
יישומים מעשיים:
hasOwnProperty() יכול להיות מאוד שימושי כאשר עושים לולאה על אובייקט בעזרת לולאת for in. אפשר לבדוק איתו אם התכונות הן מהאובייקט עצמו ולא מהפרוטוטיפ. לדוגמה:
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]);
}
}תשובה #4
זה בודק:
מחזיר ערך בוליאני המציין אם לאובייקט יש תכונה עם השם שצוין
שיטת hasOwnProperty מחזירה אמת אם לאובייקט יש תכונה בשם שצוין, ושקר אם אין לו. שיטה זו אינה בודקת אם התכונה קיימת בשרשרת הפרוטוטיפ של האובייקט; התכונה חייבת להיות חברה של האובייקט עצמו.
דוגמא:
var s = new String("Sample");
document.write(s.hasOwnProperty("split")); //false
document.write(String.prototype.hasOwnProperty("split")); //true
