Prototype [펌] prototype (1)

황제낙엽 2009.04.02 20:13 조회 수 : 3319 추천:99

sitelink4 http://1 
extra_vars4 ko 
extra_vars5 http://jaures.egloos.com/2262952 
extra_vars6 sitelink1 

1번 :

    function Func1(val) {
        this.val = val;
        this.showValue = function() {
            alert(this.val);
        };
    }
    
    var a = new Func1("Hello~");
    a.showValue();  // alert "Hello~"
    
    
2번 :

    function Func2(val) {
        this.val = val;
    }
    
    Func2.prototype.showValue = function() {
        alert(this.val);
    }
    
    var b = new Func2("World!");
    b.showValue();  // alert "World!"
    

보통 객체는 위의 1번과 2번의 방법으로 만들 수 있다. 그런데 1과 2의 차이는 무엇일까?
1번은 func1 내부에 method  showValue를 정의했고, 2번은 prototype을 이용해 외부에서 별도로 정의를 했다.

new로 각각 객체를 생성한 후 showValue() method를 실행한 결과는 기대대로 출력이 된다. 그렇다고 하면 별 차이 없는것 아닐까라고 생각할 수도 있겠지만 여기에는 보이지 않는 아주 큰 차이점이 내부적으로 존재한다.

아래를 실행했을 때의 결과는 과연 무엇일까?

    a : a.hasOwnProperty("showValue");
    b : b.hasOwnProperty("showValue");
    c : "showValue" in b;

결과는 a, c는 true, b는 false 이다. 엥? b객체의 showValue는 b의(Func2) property가 아니란 말인가?

hasOwnProperty는 해당 객체에 특정 property가 존재여부를 return 해주는 함수다. 즉, b의 showValue는 말그대로 b의 property가 아니란 얘기다. 그런데 왜 property가 존재하는지를 확인해 볼수 있는 in 연산자에서는 true가 return 되는걸까?

showValue는 b의 property가 맞긴맞다. 하지만 a.showValue와 다른점은 b.showValue는 상속받은 property라는 점이다.
여기서 다시 hasOwnProperty의 뜻을 음미해보길 바란다. 말 그대로 "has own property?" 그대로 해당 객체가 해당 property를 가지고 있는지를 확인해보는 것이다.

prototype은 new 연산자를 통해 생성된 객체모두에 상속된다. 그래서 이미 생성되어 있더라도 나중에 prototype을 통해 추가된 property를 그대로 사용할 수 있다. 이것이 중요한 이유는 바로 새로 생성되는 모든 객체가 해당 property를 직접 자신이 가지지 않고 상속받는 것이기 때문에 해당 property가 객체 자신이 소유할 필요가 없다는 뜻이된다. 이는 해당 property를 위한 메모리를 별도로 차지하지 않는다는 의미이기도 하다.

new 연산자를 사용하게 되면

1. new : property가 없는 비어있는 객체를 생성한다. 해당 객체의 prototype을 설정한다.
2. Func1("World") : 해당 함수를 호출한다. Func1의 prototype property값을 새로 생성된 객체의 prototype으로 설정한다.
3. this가 1에서 생성된 객체를 가리키게 한다.

모든 함수에는 prototype이라는 property가 있고, 이것은 함수가 정의될때 자동으로 생성되고 초기화 된다. prototype은 construct라는 property를 가지고 초기화 된다. 즉, Function.prototype.construct가 초기화 된다.

Javascript의 모든 객체는 prototype 이라고 불리는 또 다른 객체를 내부적으로 참조할 수 있도록 하는데, new를 통해 생성된 객체는 prototype의 property들을 자신의 property로 가져(상속)오게 된다. 

하지만 새로 생성된 객체에서 prototype property 값을 설정하려고 하면 그 객체의 해당 property는 더이상 prototype의 값을 참조하지 않게 된다. 즉, 생성된 객체에 해당 property가 새로 추가되게 된다.

    var b = new Func2("World!");
    b.showValue();  // alert "World!"
    b.showValue = function() { alert(1234); }
    b.showValue();  // alert 1234
번호 제목 글쓴이 날짜 조회 수
246 [Gemini] ajax 와 fetch 의 차이 황제낙엽 2025.01.04 3419
245 [검토 완료] 디바이스 카메라로 촬영한 사진을 서버에 업로드하기 샘플 황제낙엽 2024.11.21 3988
244 브라우저에서 이미지를 편집(crop 등) 할 수 있는 오픈소스 Cropper.js 황제낙엽 2024.11.16 3843
243 [ChatGPT] json data 의 정렬 [1] 황제낙엽 2024.07.23 3358
242 DOMContentLoaded 이벤트와 window.onload 이벤트 황제낙엽 2024.07.15 3673
241 fetch() 사용 예제들 황제낙엽 2024.07.09 3383
240 [Copilot] Vanilla JavaScript에서 외부 스크립트 파일에 정의된 함수들을 로드 황제낙엽 2024.06.21 3760
239 [Copilot] ES6 모듈(module) 문법 황제낙엽 2024.06.21 3815
238 [Copilot] JSON 객체 내부 데이터를 순회하면서 조회하는 코드 황제낙엽 2024.06.02 3273
237 [Copilot] JavaScript로 서버에 특정 값을 POST 방식으로 전달하고 응답을 기다리지 않고 바로 종료 황제낙엽 2024.05.31 3623
236 json 데이터 내의 변수명에 prefix 로 type 표현하기 황제낙엽 2024.04.15 3364
235 fetch() 함수 사용 예제 file 황제낙엽 2023.11.23 3607
234 현재 document 의 host 와 port 를 얻는 방법 황제낙엽 2023.10.03 4211
233 (Bard) FileReader 로 여러개의 파일을 read 하는 법 file 황제낙엽 2023.08.23 3666
232 How to build a file upload service with vanilla JavaScript file 황제낙엽 2023.08.22 3716
231 (Bard) JavaScript로 JSON 배열을 작성하는 방법 황제낙엽 2023.08.21 3674
230 모바일 브라우저에서 file input element 를 이용하여 여러장의 이미지를 서버에 전송하려 할때 [1] 황제낙엽 2023.08.21 3704
229 navigator.mediaDevices 황제낙엽 2023.08.21 3800
228 Barcode Detection API 황제낙엽 2023.08.06 3859
227 정규식을 이용한 이메일 검증 스크립트 file 황제낙엽 2023.06.25 2895