Что такое свойство в hasOwnProperty в JavaScript?

97

Рассмотреть возможность:

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

Как правильно использовать / объяснять hasOwnProperty('someProperty')?

Почему мы не можем просто someVar.somePropertyпроверить, someVarсодержит ли объект свойство с именем someProperty?

Что в этом случае есть собственность?

Какое свойство проверяет этот JavaScript?

Летать
источник
Когда я задал этот вопрос, я подумал, что это функция, которая проверяет какой-то html. Теперь я вижу, как он проверяет объект или метод javascript на наличие «переменной» внутри этого объекта или метода. спасибо!
FLY
Взгляните на developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Феликс Клинг,

Ответы:

165

hasOwnPropertyвозвращает логическое значение, указывающее, имеет ли вызываемый объект свойство с именем аргумента. Например:

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

Однако он не смотрит на цепочку прототипов объекта.

Его полезно использовать, когда вы перечисляете свойства объекта с помощью for...inконструкции.

Если вы хотите увидеть полную информацию, спецификация ES5 , как всегда, является хорошим местом.

Джеймс Аллардис
источник
6
Бонусные баллы за цепочку прототипов. Тем не менее , пытаясь выяснить , что его призывают , когда его не называли на объект ... его неwindow
Кристоффер Салль-Storgaard
@KristofferSHansen - Мне тоже это было интересно, но вопрос был отредактирован, поэтому теперь он вызывается для объекта. Если это не так, выдается ошибка.
Джеймс Аллардис,
Я полагаю, это меняет ситуацию. Однако при запуске с консоли в Chrome ошибок нет.
Кристоффер Салл-Сторгаард,
@KristofferSHansen - Я думаю, это из-за того, как консоль запускает код (он запускается как evalкод, а не как глобальный или функциональный код). Я попробовал это на пустой HTML-странице и получил ошибку «не могу преобразовать null в объект».
Джеймс Аллардис,
@KristofferSHansen см. Ответ Кунала Вашиста, когда он вызывается в методе класса
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?
Хамид Араги 05
> "вы тоже проходите цикл через эти пары ключ-значение метаинформации" Но когда я в 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- но я думаю, что теперь все стало ясно ... это потому, что из-за моей проблемы с Интернетом я не могу опубликовать больше ..........
Pranay Rana
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.

Kennebec
источник
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

Сцена 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

Поскольку 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а не
Кристоффер Салл-Сторгаард
12
Проблема в том, когда propимеет ложное значение. if(obj.hasOwnProperty('prop'))будет trueпока if(obj.prop)будет false.
Родриго Салинг,