# Object

**Object API 사용법**

prototype의 유무의 차이에 대해 자세히 알아보자.

```javascript
//Object.keys()
var arr = ["a","b","c"];
//배열에서 key는 index이므로 배열의 index를 배열로 만들어서 리턴한다.
console.log('Object.keys(arr)', Object.keys(arr));//will alert "0,1,2"

//Object.prototype.toString()
var o = new Object();//객체를 생성하여 o에 할당한다.>Object는 생성자 함수라는 것이다.
console.log('o.toString()', o.toString());

var a = new Array(1,2,3);
console.log('a.toString()', a.toString());

```

**Object 확장**

어느 객체에서나 사용할 수 있는 메소드를 만드는 방법에 대해 알아보자.

containe은 객체에 해당 value가 존재하는지 확인하고, 있다면 true, 없다면 false를 리턴한다. 공부할 때 어떤 기능의 원리를 먼저 보기보다, 그 기능이 어떻게 사용되고, 그 기능의 취지를 먼저 알기를 권장한다.

```javascript
Object.prototype.contain = function(needle){//모든 객체의 부모Object의 메소드를 만든다.
    for(var name in this) {//메소드 안에서 this는 메소드가 소속된 객체!
        //name에는 각각의 key값이 담기게 된다.마치 index처럼 사용된다.
        if(this[name] === needle){
            return true;
        }
    }//끝까지 다 돌았는데 없으면 false를 리턴.
    return false;
}
var o = {'name':'egoing','city':'seoul'}
console.log(o.contain('egoing'));
```

이러한 Object의 확장은 모든 객체에 영향을 주기 때문에 위험하다.

```javascript
a = ["egoing","leezche", "graphittie"]
o = Object {'name':'egoing','city':'seoul', contain:function}
for(var name in o){
    console.log(name);//name과 city, contain가 출력된다.
    console.log(o[name]);//egoing과 seoul, 그리고 contain 함수가 출력된다.
}
```

Object.prototype.contain으로 추가했기 때문에 모든 객체에 부모로부터 상속받은 property인 contain이 추가된다.

hasOwnProperty로 해결할 수 있다.해당 객체가 부모로부터 상속받은 property가 아니라,**자신의 property**로 가지고 있는지를 확인한다. 상속받은 것과 직접적으로 가지고 있는지를 확인할 수 있다.

```javascript
Object.prototype.contain = function(needle){//모든 객체의 부모Object의 메소드를 만든다.
    for(var name in this) {//메소드 안에서 this는 메소드가 소속된 객체!
        //name에는 각각의 key값이 담기게 된다.마치 index처럼 사용된다.
        if(this[name] === needle){
            return true;
        }
    }//끝까지 다 돌았는데 없으면 false를 리턴.
    return false;
}
var o = {'name':'egoing','city':'seoul'}
var a = {'egoing','leezche','graphittie'];

for(var name in a){//o로 실행하면 name과 city만 출력된다.
    if(a.hasOwnProperty(name)){//contain은 제거되고 0,1,2만 출력된다.
        console.log(name);
    }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://heunnajo.gitbook.io/javascript/object-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
