Що таке властивість у hasOwnProperty в JavaScript?


97

Розглянемо:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

Яке правильне використання / пояснення hasOwnProperty('someProperty')?

Чому ми не можемо просто someVar.somePropertyперевірити, чи someVarмістить об’єкт властивість з ім’ям someProperty?

Що є властивістю в цьому випадку?

Яку властивість перевіряє цей JavaScript?



Коли я задав це запитання, я подумав, що це функція, яка перевіряє якийсь html. Тепер я бачу, як він перевіряє об’єкт чи метод javascript на наявність „змінної” в межах цього об’єкта чи методу. thnx!
FLY

Відповіді:


166

hasOwnPropertyповертає логічне значення, яке вказує, чи має об'єкт, для якого ви його викликаєте, властивість з ім'ям аргументу. Наприклад:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

Однак він не розглядає ланцюжок прототипів об'єкта.

Корисно використовувати його, коли ви перераховуєте властивості об'єкта за допомогою for...inконструкції.

Якщо ви хочете ознайомитися з усіма деталями, специфікація ES5 , як завжди, є гарним місцем для пошуку.


6
Бонусні бали за ланцюжок прототипів. Все ще намагаюся зрозуміти, до чого його закликають, коли його не викликають на об’єкт ... його ніwindow
Кристоффер Салл-Сторгаард

@KristofferSHansen - Мені це теж було цікаво, але питання відредаговано, тому воно зараз викликається на об'єкті. Коли це не так, виникає помилка.
James Allardice

Я припускаю, що це змінює ситуацію. Немає помилок під час запуску з консолі в Chrome.
Kristoffer Sall-Storgaard

@KristofferSHansen - Я думаю, це через те, як консоль запускає код (він виконується як evalкод, а не як глобальний або функціональний код). Я спробував це на порожній сторінці HTML і отримав помилку "не вдається перетворити null на об'єкт".
James Allardice

@KristofferSHansen побачити відповідь Kunal Vashist, коли його викликають методом класу
FLY

25

Ось коротка і точна відповідь:

У JavaScript кожен об'єкт має купу вбудованих пар ключ-значення, які містять метаінформацію про об'єкт. Коли ви прокручуєте всі пари ключ-значення, використовуючи for...inконструкцію / цикл для об'єкта, ви також переглядаєте ці пари мета-інформація ключ-значення (чого ви точно не хочете).

Введіть тут опис зображення

Використовуючи hasOwnPropery(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

Сподіваюся, це зрозуміло!


в останньому рядку вашого прикладу ви пишете console.log(Object.prototype....; ти мав на увазі console.log(fruitObject.? fruitObject чи Object?
Хамід Арагі

> "Ви теж циклічно переглядаєте ці пари мета-інформація ключ-значення". Але коли я for (var key in fruitObject) { ... }все одно запускаю js лише цикл через непрототипні ключі, мені щось не вистачає, чи середовище виконання JS змінило спосіб обробки ключів у об'єкті петлі?
ChickenFeet

13

Він перевіряє:

Повертає логічне значення, яке вказує, чи має об'єкт властивість із зазначеним ім'ям

Метод hasOwnProperty повертає true, якщо об'єкт має властивість із зазначеним іменем, false, якщо цього немає. Цей метод не перевіряє, чи існує властивість у ланцюжку прототипів об’єкта; властивість має бути членом самого об’єкта.

Приклад:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
Я дав -1, тому що ваша початкова відповідь була коротким і абсолютно незв’язним реченням, яке потім оновилося трохи довшим, трохи більш зв’язним, але цілком неточним реченням.

@ amnotiam- але я думаю, що зараз це набагато зрозуміліше ... це через те, що моєї проблеми з Інтернетом я не можу розмістити більше ..........
Пранай Рана

12

Короткий зміст:

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. Кожна особа має своє власне ім'я, яке ініціюється в конструкторі. Однак вік визначається не на об’єкті, а на прототипі об’єкта. Тому 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]);
  }
}


3

Ви використовуєте object.hasOwnProperty ( p ), щоб визначити, чи має об'єкт незліченну властивість p -

Об'єкт може мати власний прототип, де методи та атрибути за замовчуванням присвоюються кожному екземпляру об'єкта. hasOwnProperty повертає true лише для властивостей, які були спеціально встановлені в конструкторі або додані до екземпляра пізніше.

Щоб визначити, чи визначено p взагалі, де завгодно, де-небудь для об’єкта, використовуйте if ( p instanceof object), де p обчислюється як рядок з назвою властивості.

Наприклад, за замовчуванням усі об'єкти мають метод 'toString', але він не відображатиметься у hasOwnProperty.


2

hasOwnProperty - це звичайна функція JavaScript, яка приймає аргумент рядка.

У вашому випадку somevar.hasOwnProperty('someProperty')він перевіряє somevar, someproperyчи має функція чи ні, - повертає true і false.

Сказати

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertyправильний спосіб перевірки в об'єкт має властивість чи ні. someVar.somePropertyне може бути використана як альтернатива цій ситуації. Наступна умова покаже хорошу різницю:

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
}

Отже, someVar.isFirstне може бути використана альтернатива someVar.hasOwnProperty('isFirst').


-1

Сцена А:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

Сцена Б:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

Оскільки JavaScript не захищає властивість hasOwnProperty. Тож ви можете використовувати його так:

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

-2

Він перевіряє, чи має об’єкт властивість . Це працює так само if(obj.prop), наскільки я знаю.


7
obj.propслідує за прототипом, а hasOwnPropertyне
Kristoffer Sall-Storgaard

12
Проблема полягає в тому, коли propмає хибне значення. if(obj.hasOwnProperty('prop'))буде trueпоки if(obj.prop)буде false.
Родріго Салінг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.