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.