JavaScript에서 hasOwnProperty의 속성은 무엇입니까?


99

중히 여기다:

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

의 올바른 사용 / 설명은 hasOwnProperty('someProperty')무엇입니까?

someVar.someProperty객체 someVar에 이름이있는 속성이 있는지 확인하는 데 사용할 수없는 이유는 무엇 someProperty입니까?

이 경우 속성은 무엇입니까?

이 JavaScript는 어떤 속성을 확인합니까?



이 질문을했을 때 html을 확인하는 기능이라고 생각했습니다. 이제 해당 개체 또는 메서드 내에서 '변수'에 대한 자바 스크립트 개체 또는 메서드를 확인하는 것을 봅니다. thnx!
— FLY

답변:


169

hasOwnProperty호출하는 객체에 인수 이름이있는 속성이 있는지 여부를 나타내는 부울 값을 반환합니다. 예를 들면 :

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

그러나 객체의 프로토 타입 체인은 보지 않습니다.

for...in구문 을 사용하여 개체의 속성을 열거 할 때 사용하는 것이 유용합니다 .

전체 세부 사항을보고 싶다면 ES5 사양 이 항상 그렇듯이보기에 좋은 곳입니다.


6
프로토 타입 체인에 대한 보너스 포인트. 아직 ...이 아니 그가이 객체에 호출되지 때 호출 무엇인지 알아 내려고window
— 크리스토퍼 Sall이-Storgaard

@KristofferSHansen-저도 궁금했지만 질문이 편집되어 이제 객체에서 호출되고 있습니다. 그렇지 않으면 오류가 발생합니다.
— James Allardice

나는 그것이 상황을 바꾼다고 생각합니다. 그래도 Chrome의 콘솔에서 실행할 때 오류가 없습니다.
— Kristoffer Sall-Storgaard

@KristofferSHansen-콘솔이 코드를 실행하는 방식 때문이라고 생각합니다 ( eval글로벌 또는 함수 코드가 아닌 코드로 실행 됨 ). 빈 HTML 페이지에서 시도했는데 "null을 개체로 변환 할 수 없습니다"오류가 발생합니다.
— James Allardice

@KristofferSHansen 클래스 메서드에서 호출 될 때 Kunal Vashist 답변을 참조하십시오
— FLY

26

짧고 정확한 대답은 다음과 같습니다.

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?
— 하미드 Araghi

> "당신은이 메타 정보 키-값 쌍도 반복하고 있습니다."하지만 for (var key in fruitObject) { ... }어쨌든 비 프로토 타입 키를 통해 js 만주기를 실행할 때 뭔가 누락되었거나 JS 런타임이 키-인-오브젝트 처리 방식을 변경 했습니까? 루프?
— ChickenFeet

14

다음을 확인합니다.

객체에 지정된 이름의 속성이 있는지 여부를 나타내는 부울 값을 반환합니다.

hasOwnProperty의 개체가 그렇지 않은 경우는 false 지정된 이름의 속성을 가지고있는 경우 메소드는 true를 반환합니다. 이 메서드는 객체의 프로토 타입 체인에 속성이 있는지 확인하지 않습니다. 속성은 개체 자체의 구성원이어야합니다.

예:

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

2
당신의 초기 답변이 짧고 완전히 일관성이없는 문장 이었기 때문에 나는 -1을주었습니다. 그런 다음 약간 더 길고, 약간 더 일관성이 있지만, 완전히 부정확 한 문장으로 업데이트되었습니다.

@ amnotiam-하지만 난 그 훨씬 명확 ... 지금의 내가 할 수없는 내 인터넷 문제가 더 게시 할 수 있기 때문에 .......... 생각
— Pranay라나

13

요약:

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


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

장면 A :

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])
  }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.