10-6. Object 오브젝트(ES3 기준) / 프로퍼티 처리 메소드
hasOwnProperty()
구분 | 데이터(값) |
---|---|
object | 기준 인스턴스 |
파라미터 | 프로퍼티 이름 |
반환 | true, false |
인스턴스에 파라미터 이름이
- 존재하면 true 반환
- 존재하지 않으면 false 반환
var obj = { value: 123 }; var own = obj.hasOwnProperty("value"); console.log(own); // true
- obj 인스턴스에 value 프로퍼티가 존재하며
- obj를 만들면서 직접 작성했으므로 true 반환
var obj = { value: undefined }; var own = obj.hasOwnProperty("value"); console.log(own); // true
- undefined가 값이지만 false로 인식됩니다.
- 하지만, 값은 체크하고 존재여부만 체크하므로 true 반환
자신이 만든 것이 아니라
- 상속받은 프로퍼티이면 false 반환
var obj = {}; var own = obj.hasOwnProperty("hasOwnProperty"); console.log(own); // false
hasOwnProperty()
는 자신이 만든 것이 아니라 빌트인 Object 오브젝트에 있는 것- {}를 실행하면 빌트인 Object 오브젝트의 prototype에 연결된 메소드를 사용하여
- Object 인스턴스를 만드므로 자신이 만든 것이 아닙니다.
var obj = {};
빌트인 Object 오브젝트의 prototype에 있는 6개의 메소드를 활용해 인스턴스를 만듭니다.
그 6개 중 하나가 hasOwnProperty
입니다.
obj.hasOwnProperty
로 함수를 호출하면 당연히 존재하니까 호출됩니다.
그런데 hasOwnProperty
는 내가 만든 것이 아니라 빌트인 Object 오브젝트에서 만든겁니다.
내가 만든 것은 아까 위의 코드에서 보았듯이
var obj = {value: "value"};
이렇게 작성되어야 합니다.
위와 같은 것이 내가 만든 것입니다.
그러나 hasOwnProperty
는 내가 만든 것이 아니라 빌트인 Object 오브젝트가 만든 것입니다.
그래서 false
가 반환됩니다.
propertyIsEnumerable()
구분 | 데이터(값) |
---|---|
object | 인스턴스, 오브젝트 |
파라미터 | 프로퍼티 이름 |
반환 | true, false |
오브젝트에서 프로퍼티를
열거할 수 있으면 true 반환
var obj = { sports: "축구" }; console.log(obj.propertyIsEnumerable("sports")); // true
- { sports: “축구” } 형태로 생성한 인스턴스는
- obj의 프로퍼티를 열거할 수 있습니다.
위 형태는
for in
문으로 열거할 수 있습니다.
따라서true
가 반환됩니다.열거할 수 없으면 false 반환
var obj = { sports: "축구" }; Object.defineProperty(obj, "sports", { enumerable: false }); console.log(obj.propertyIsEnumerable("sports")); // false for (var name in obj) { console.log(name); }
- {enumerable: false}로 열거 불가 설정
- for-in 문에서 프로퍼티가 열거되지 않습니다.
- Object(ES5)에서 다룹니다.
defineProperty
함수는 ES5에서 나왔습니다.
위의 코드는 enumerable: false
를 만들기 위해 사용했습니다.
이것은 열거할 수 없는 상태로 설정하는 것입니다.
- 첫번째 파라미터 : 오브젝트
- 두번째 파라미터 : 프로퍼티 이름
그리고 {} 중괄호에다가 enumerable: false
를 작성하면 sports 프로퍼티를 열거할 수 없는 상태로 설정합니다.
즉, for in 문으로 돌려도 나오지 않습니다.
이와 같이 ES5에서는 프로퍼티를 열거하거나 삭제하거나 변경하거나, 그런 함수들이 추가되었습니다.
이에 대해선 뒤에 ES5 강좌에서 다루겠습니다.