728x90
반응형
728x90
반응형

Element 객체

Element 객체는 엘리먼트를 추상화한 객체

DOM은 마크업언어를 제어하기 위한 표준

 


 -식별자 API

<script>

console.log(document.getElementById('active').tagName)// LI
 var active = document.getElementById('active');
console.log(active.id); // active
var active = document.getElementById('active');
// class 값을 변경할 때는 프로퍼티의 이름으로 className을 사용
active.className = "important current";
console.log(active.className); // important current
active.className += " readed" // 클래스를 추가할 때는 아래와 같이 문자열의 더한다.
var active = document.getElementById(‘active’);
for(var i=0; i<active.classList.length; i++){
        console.log(i, active.classList[i]);
}
active.classList.add('marked'); // 추가
active.classList.remove('important'); // 제거
active.classList.toggle('current'); // 토글
</script>


 -조회 API

  <script>

    var list = document.getElementsByClassName('marked');

    console.group('document');

    for(var i=0; i<list.length; i++){

        console.log(list[i].textContent); // html, dom, bom

    }

    console.groupEnd();

    

    console.group('active');

    var active = document.getElementById('active');    

    var list = active.getElementsByClassName('marked');

    for(var i=0; i<list.length; i++){

        console.log(list[i].textContent); // dom, bom

    }

    console.groupEnd();

</script>

  

 -속성 API

<a id="target" href="http://opentutorials.org">opentutorials</a>

<script>

var t = document.getElementById('target');

console.log(t.setAttribute(‘href’, ‘http://opentutorials.org/course/1’);

console.log(t.getAttribute('href')); //http://opentutorials.org

t.setAttribute('title', 'opentutorials.org'); // title 속성의 값을 설정한다.

console.log(t.hasAttribute('title')); // true, title 속성의 존재여부를 확인한다.

t.removeAttribute('title'); // title 속성을 제거한다.

console.log(t.hasAttribute('title')); // false, title 속성의 존재여부를 확인한다.

</script>

속성과 프로퍼티

<p id="target">

    Hello world

</p>

<script>

    var target = document.getElementById('target');  

    target.setAttribute('class', 'important');  // attribute 방식

    target.className = 'important'; //// property 방식

</script>

속성과 프로퍼티 둘의 차이점

<a id="target" href="./demo1.html">ot</a>

<script>

//현재 웹페이지가 http://localhost/webjs/Element/attribute_api/demo3.html 일 때

var target = document.getElementById('target');

console.log('target.href', target.href); // http://localhost/webjs/Element/attribute_api/demo1.html

console.log('target.getAttribute("href")', target.getAttribute("href")); // ./demo1.html

</script>

 -jQuery 속성 제어 API

<a id="target" href="http://opentutorials.org">opentutorials</a>

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

<script>

var t = $('#target');

console.log(t.attr('href')); //http://opentutorials.org

t.attr('title', 'opentutorials.org'); // title 속성의 값을 설정한다.

t.removeAttr('title'); // title 속성을 제거한다.

</script>

jquery에서 attribute property

<a id="t1" href="./demo.html">opentutorials</a>

<input id="t2" type="checkbox" checked="checked" />

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

<script>

// 현재 문서의 URL이 아래와 같다고 했을 때,

// http://localhost/jQuery_attribute_api/demo2.html

var t1 = $('#t1');

console.log(t1.attr('href')); // ./demo.html

console.log(t1.prop('href')); // http://localhost/jQuery_attribute_api/demo.html

 

var t2 = $('#t2');

console.log(t2.attr('checked')); // checked

console.log(t2.prop('checked')); // true

</script>

Attr attribute, prop property 방식

 -jQuery 조회 범위 제한

<ul>

    <li class="marked">html</li>

    <li>css</li>

    <li id="active">JavaScript

        <ul>

            <li>JavaScript Core</li>

            <li class="marked">DOM</li>

            <li class="marked">BOM</li>

        </ul>

    </li>

</ul>

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

<script>

    //$( ".marked", "#active").css( "background-color", "red" );

    //$( "#active .marked").css( "background-color", "red" );

    $( "#active").find('.marked').css( "background-color", "red" );

</script>

find를 너무 복잡하게 사용하면 코드를 유지보수하기 어렵습니다.

Node객체

시조는 최상위의 조상을 의미

node객체는 최상위 객체를 의미, 모든 객체는 node객체를 상속받음

 -Node 관계 API

 

<body id="start">

<ul>

    <li><a href="./532">html</a></li>

    <li><a href="./533">css</a></li>

    <li><a href="./534">JavaScript</a>

        <ul>

            <li><a href="./535">JavaScript Core</a></li>

            <li><a href="./536">DOM</a></li>

            <li><a href="./537">BOM</a></li>

        </ul>

    </li>

</ul>

<script>

var s = document.getElementById('start');

console.log(1, s.firstChild); // #text

var ul = s.firstChild.nextSibling

console.log(2, ul); // ul

console.log(3, ul.nextSibling); // #text, 다음 형제 노드

console.log(4, ul.nextSibling.nextSibling); // script

console.log(5, ul.childNodes); //text, li, text, li, text, li, text

console.log(6, ul.childNodes[1]); // li(html), 자식노드들을 유사배열에 담아서 리턴

console.log(7, ul.parentNode); // body

</script>

</body>

 -노드 종류 API

Node.nodeType // node의 타입을 의미

Node.nodeName // node의 이름 (태그명을 의미)

재귀함수 : 함수가 지가 자신을 호출하는 것

<!DOCTYPE html>

<html>

<body id="start">

<ul>

    <li><a href="./532">html</a></li>

    <li><a href="./533">css</a></li>

    <li><a href="./534">JavaScript</a>

        <ul>

            <li><a href="./535">JavaScript Core</a></li>

            <li><a href="./536">DOM</a></li>

            <li><a href="./537">BOM</a></li>

        </ul>

    </li>

</ul>

<script>

function traverse(target, callback){

    if(target.nodeType === 1){ // 1==Node.ELEMENT_NODE

        //if(target.nodeName === 'A')

        callback(target);

        var c = target.childNodes; // 자식 노드들을 유사배열에 담아서 리턴

        for(var i=0; i<c.length; i++){

            traverse(c[i], callback);      

        }  

    }

}

traverse(document.getElementById('start'), function(elem){

    console.log(elem);

});

</script>

</body>

</html>

 -노드 변경 API

   

appendChild(child) // 노드의 마지막 자식으로 주어진 엘리먼트 추가

insertBefore(newElement, referenceElement) // appendChild와 동작방법은 같으나 두번째 인자로 엘리먼트를 전달 했을 때 이것 앞에 엘리먼트가 추가

removeChild(child) // 노드 제거

replaceChild(newChild, oldChild) // 노드 바꾸기

 -jQuery 노드 변경 API

.jQuery에서 노드를 제어하는 기능은 주로 Manipulation 카테고리에 속해 있음

<div class="target">

    content1

</div>

<div class="target">

    content2

</div>

 

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

<script>

    $('.target').before('<div>before</div>');

    $('.target').after('<div>after</div>');

    $('.target').prepend('<div>prepend</div>'); // 이전 추가

    $('.target').append('<div>append</div>'); // 이후 추가

</script>

remove는 선택된 엘리먼트를 제거하는 것이고 empty는 선택된 엘리먼트의 텍스트 노드를 제거하는 것

<div class="target" id="target1">

    target 1

</div>

<div class="target" id="target2">

    target 2

</div>

 

<input type="button" value="remove target 1" id="btn1" />

<input type="button" value="empty target 2" id="btn2" />

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

<script>

    $('#btn1').click(function(){

        $('#target1').remove();

    })

    $('#btn2').click(function(){

        $('#target2').empty();

    })

</script>

교체

 

클론

이동

 -문자열 노드 제어

   innerHTML : 문자열로 자식 노드를 만들 수 있는 기능을 제공

   outerHTML : 선택한 엘리먼트를 포함해서 처리

   innerTEXT, innerTEXT : innerHtml, outerHTML과 다르게 이 API들은 값을 읽을 때는 HTML 코드를 제외한 문자열을 리턴하고, 값을 변경할 때는 HTML의 코드를 그대로 추가

   insertAdjacentHTML : 좀 더 정교하게 문자열을 이용해서 노드를 변경하고 싶을 때 사용

   

 



출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

DOM

Document Object Model로 웹 페이지를 자바스크립트로 제어하기 위한 객체 모델을 의미합니다. Window 객체의 document 프로퍼티를 통해서 사용할 수 있습니다. Window 객체가 창을 의미한다면 Document 객체는 윈도우에 로드된 문서를 의미한다고 할 수 있습니다.

제어 대상을 찾기

브라우저가 만든 객체를 찾는 것

*document.getElementsByTagName : 태그의 이름이 li인 객체를 리턴합니다.

ul태그 내에 있는 li에 해당하는 객체를 찾으려면 즉 조회의 대상을 좁히려면

var ul = = document.getElementsByTagName('ul’)[0];

var lis = ul.getElementsByTagName('li');

    for(var i=0; i < lis.length; i++){

        lis[i].style.color='red';  

    }

*document.getElementsByClassName : className‘active’ 엘리먼트를 조회

var lis = document.getElementsByClassName('active');

    for(var i=0; i < lis.length; i++){

        lis[i].style.color='red';  

    }

*document.getElementById : 하나의 결과만을 조회, id‘active’ 엘리먼트를 조회

var li = document.getElementById('active');

li.style.color='red';

문서에서 id는 유일무이한 식별자 값이기 때문에 하나의 값이 됩니다.

*document.querySelector : 선택자를 인자로 받아 해당하는 엘리먼트를 리턴

var li = document.querySelector('li');

li.style.color='red';

var li = document.querySelector('.active');

li.style.color='blue';

jQuery(자바스크립트 라이브러리)

DOM을 내부에 감추고 보다 쉽게 웹 페이지를 조작할 수 있도록 돕는 도구

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script> <!--jquery사용법, http://와 같게 동작 -->

<script src=”../lib/jQuery/jquery-1.11.0.min.js”> <!--같은 방법-->

<script>

    jQuery( document ).ready(function( $ ) {

      $('body').prepend('<h1>Hello world</h1>'); // prepend() : 추가하는 메소드

    });

</script>


제어 대상을 찾기(jQuery)

jQuery의 기본 문법은 단순하고 강력합니다.

$() jquery function . 은 엘리먼트를 재어하는 다양한 메소드

Jquery 객체 : jquery function함수를 통해 리턴된 값

Jquery dom의 차이

코딩의 길이가 다름, 코드작성이 수월함, 빠르게 처리 가능

클래스명을 줄 때 .을 쓴다.

Id값은 #을 사용, 코드의 중복 사용을 없앨 수 있음(Chaining)

HTMLElement

 
  • HTML
  • CSS
  • JavaScript
 

document.getElementById : 리턴 데이터 타입은 HTMLLIELement, 1개만 리턴

document.getElementsByTagName : 리턴 데이터 타입은 HTMLCollection, 복수개를 리턴

 

링크는 href속성이 있어 href는 주소를 나타냄

Input의 경우 type, value의 속성이 있음

각각의 성격과 쓰임과 스펙에 따라 의미가 다름

 
opentutorials
  • HTML
  • CSS
  • JavaScript
 

 

모든 엘리먼트는 HTMLElement의 자식입니다. 따라서 HTMLElement의 프로퍼티를 똑같이 가지고 있습니다. 동시에 엘리먼트의 성격에 따라서 자신만의 프로퍼티를 가지고 있는데 이것은 엘리먼트의 성격에 따라서 달라집니다. HTMLElement Element의 자식이고 Element Node의 자식입니다. Node Object의 자식입니다. 이러한 관계를 DOM Tree라고 합니다.

HTMLCollection

리턴 결과가 복수인 경우에 사용하게 되는 객체

 

jQuery 객체

var li = $(‘li’); jquery function, li jquery object

li.css(‘text-decoration’, ‘underline’); //암시적 반복

 

jquery 객체 조회하기

 


 

Map()함수를 사용해 조회 결과 이용

 


 



출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

BOM(Browser Object Model)

웹 브라우저의 창이나 프레임을 추상화해서 프로그래밍적으로 제어할 수 있도록 제공하는 수단, Window 객체의 프로퍼티와 메소드의 사용법을 배우는 것

전역객체 Window

alert('Hello world'); //window를 생략한 것과 같은 효과

window.alert('Hello world');

bom, dom, jsCore 모두 Window에 소속되어 있는 객체

웹브라우저 자바스크립트에서 Window 객체는 ECMAScript의 전역객체이면서 동시에 웹브라우저의 창이나 프레임을 제어하는 역할을 합니다.

 

사용자와 커뮤니케이션 하기

alert 경고창 :  사용자에게 정보를 제공하거나 디버깅의 용도로 사용

confirm : 확인을 누르면 true, 취소를 누르면 false값을 리턴

prompt : 사용자가 입력한 값을 받아 js가 얻을 수 있는 기능


Location 객체

location객체는 문서의 주소와 관련된 객체로 window 객체의 프로퍼티입니다.

객체를 이용해 문서의 URL을 변경할 수 있고, 문서의 위치와 관련해 다양한 정보를 얻을 수 있습니다.

현재 윈도우의 URL 알아내기 : console.log(location.toString(), location.href);

http : 웹 페이지를 웹 서버와 클라이언트가 정보를 주고 받기 위한 통신 규약

host : 컴퓨터를 식별하는 것

port : 컴퓨터에 돌아가는 서버, 소프트웨어들 식별하는 것

location.protocol : http , location.host : opentutorials.org

location.port : 80, location.pathname : /module/904/6634

location.search : 물음표 뒤에 따라오는 정보, location.hash : #뒤에 정보

location객체는 URL변경과 reload의 기능도 합니다.

location.href = ‘http://www.naver.com’;

location = ‘animal-park.tistory.com’;

location.reload();

Navigator 객체

Navigator객체 : 브라우저의 정보를 제공하는 객체

크로스 브라우징(Cross Browsing) :

ie, ff, chrome, safari, opera 각각의 브라우저 동작 방법은 W3C(dom), ECMA(js) 국제 표준화 기구에서 정의한 스펙에 따라 브라우저를 만드는 것

넷스케이프              Internet Explorer

addEventListener      attachEvent

개발자의 고충을 해결하기 위해 등장한 것이 웹 표준

표준에 정의된 스펙을 따르며 효율적으로 성능의 면으로 경쟁을 하게 됩니다.

 

console.dir(navigator); // navigator객체 프로퍼티의 리스트를 알 수 있음

console.log(appName); // 웹브라우저의 이름으로 IE Microsoft Internet Explorer, 파이어폭스, 크롬등은 Nescape로 표시

console.log(appVersion); // 브라우저의 버전을 의미

console.log(platform); // 브라우저가 동작하고 있는 운영체제에 대한 정보

 

창 제어

window.open : 새창을 만드는 메소드

window.close : 새창을 닫는 메소드

팝업 차단

같은 도메인의 사이트라면 원격에 다른 웹 페이지를 제어하는 것을 허용합니다.

도메인이 다르다면 서비스에 접근해 악의적인 일을 할 수 있기 때문에 제어를 허용하지 않습니다.

팝업을 기본적으로 차단하고 명시적으로 허용할 때 사이트가 열리도록 함

스크립트 태그 안의 팝업은 차단되지만 window.open 시 팝업은 차단되지 않습니다.


출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

HTML CSS JavaScript(웹 페이지를 제어하는 역할)

HTML에서 JavaScript로드하기

Inline 방식은 태그에 직접 자바스크립트를 직접 기술하는 방식입니다.

장점은 연관된 스크립트가 분명하게 드러난다는 점입니다. 하지만 정보와 제어가 같이 있기 때문에 정보로서 가치가 떨어집니다.

<input type="button" onclick="alert('Hello world')" value="Hello world" />

<script>태그 이용

<input type="button" id="hw" value="Hello world" />

<script type="text/javascript">

    var hw = document.getElementById('hw');

    hw.addEventListener('click', function(){

        alert('Hello world');

    })

</script>

html코드 안에 자바스크립트가 존재하지 않습니다. 또한, 자바스크립트 유지보수하기에 바람직합니다.

외부 파일로 분리

정보와 제어의 결합도를 낯추며 유지보수의 편의성이 높아집니다.

<script src="./script2.js"></script>

script2.js  파일 내 코드

var hw = document.getElementById('hw');

hw.addEventListener('click', function(){

    alert('Hello world');

})

Script파일의 위치

  

head 태그에 위치시킬 수 있지만 이 경우는 오류가 발생할 수 있습니다.

Id hw의 존재를 해석하기 전의 상태에서 조회를 하고 있기 때문에 null의 상태가 됩니다. 존재하지 않는 객체를 호출한 상태이기 때문에 오류가 발생합니다.

window.onload = function(){

    var hw = document.getElementById('hw');

    hw.addEventListener('click', function(){

        alert('Hello world');

    })

} //윈도우 객체 onload를 호출하도록 약속, 태그가 화면이 등장한 이후 스크립트 //코드가 실행되기 때문에 오류를 없앨 수 있습니다.

script 파일은 head 태그 보다 페이지의 하단에 위치시키는 것이 더 좋은 방법입니다.


Object Model

객체화란 무엇인가?



테두리와 같은 역할을 합니다.

각각의 태그마다 객체를 만들어 준비를 해놓은 상태, 태그에 해당하는 객체를 찾아 메소드를 호출하거나 프로퍼티를 가져오는 것

객체화 = 객체 제어 방법

var imgs = document.getElementsByTagName(‘img’);

imgs[0].style.width=’300px’;

 

JavaScript Core, BOM DOM(윈도우 객체의 프로퍼티)

window : 전역객체

JavaScript Core : JavaScript 언어 자체에 정의되어 있는 객체들

BOM(Browser Object Model) : 웹페이지의 내용을 제외한 브라우저의 각종 요소들을 객체화시킨 것

DOM(Document Object Model) : 웹페이지의 내용을 제어


출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

데이터 타입

데이터 타입이란 데이터의 형태를 의미합니다. 여러 개의 데이터 타입이 존재합니다.

원시 데이터 타입(primitive type) : 숫자, 문자열, 불리언, null, undefined

레퍼 객체

var str = 'coding';

console.log(str.length);        // 6 . Object Access Operator 객체 접근 연산자

console.log(str.charAt(0));     // "C"

문자열은 분명히 프로퍼티와 메소드가 있습니다. 그렇다면 객체인데 왜 문자열이 객체가 아니라고 하는 것 일까요? 그것은 내부적으로 문자열이 원시 데이터 타입이고 문자열과 관련된 어떤 작업을 하려고 할 때 자바스크립트는 임시로 문자열 객체를 만들고 사용이 끝나면 제거하기 때문입니다. 이러한 처리는 내부적으로 일어납니다. 그렇기 때문에 몰라도 되지만 원시 데이터 타입과 객체는 좀 다른 동작 방법을 가지고 있기 때문에 이들을 분별하는 것이 필요하게 됩니다..

 

var str = 'coding';

str.prop = 'everybody';

console.log(str.prop);      // undefined

str.prop를 하는 순간에 자바스크립트 내부적으로 String 객체가 만들어집니다. prop 프로퍼티는 이 객체에 저장되고 이 객체는 곧 제거 됩니다. 그렇기 때문에 prop라는 속성이 저장된 객체는 존재하지 않게 됩니다. 이러한 특징은 일반적인 객체의 동작 방법과는 다릅니다. 하지만 문자열과 관련해서 필요한 기능성을 객체지향적으로 제공해야 하는 필요 또한 있기 때문에 원시 데이터 형을 객체처럼 다룰 수 있도록 하기 위한 객체를 레퍼 객체(wrapper object)라고 합니다.

 

참조

컴퓨터의 가장 중요한 특징은 복제입니다. 현실에서 사물이 있으면 복제하기 위해서 시간과 자원이 필요합니다. 전자화된 시스템에서 데이터를 복제하는 것은 비용이 들지 않습니다.

참조(reference)는 전자화된 시스템의 중요한 개념입니다. 참조는 윈도우의 바로가기를 만들면 파일이 가리키는 방향이 같습니다. 이 기능이 참조입니다.

참조는 저장 장치의 용량을 절약할 수 있고, 원본 파일을 사용하고 있는 모든 복제본이 동일한 내용을 유지할 수 있게 됩니다.

var a = {'id':1};               var a = {'id':1};

var b = a;                     var b = a;

b.id = 2;                       b = {‘id’: 2};

console.log(a.id);  // 2     console.log(a.id);  // 1

 

a = 1;

a = {'id':1};

전자는 데이터형이 숫자이고 후자는 객체입니다. 숫자는 원시 데이터형(Primitive Data Types)입니다. 자바스크립트에서 원시 데이터형을 제외한 모든 데이터 타입은 객체입니다. 객체는 다른 말로 참조 데이터 형(참조 자료형)이라고 부릅니다. 기본 데이터형은 위와 같이 복제 되지만 참조 데이터형은 참조 됩니다. 모든 객체는 참조 데이터형입니다.

변수에 담겨있는 데이터가 원시형이면 그 안에는 실제 데이터가 들어있고, 객체이면 변수 안에는 데이터에 대한 참조 방법이 들어있다고 할 수 있습니다.

 

함수와 참조

 
var a = 1;               var a = {'id':1};                 var a = {'id':1};
function func(b){        function func(b){                 function func(b){
    b = 2;                   b = {'id':2};                     b.id = 2;
}                        }                                 }
func(a);                 func(a);                          func(a);
console.log(a); /* 1*/   console.log(a.id);  /* 1*/        console.log(a.id);  /* 2*/
 

문자열, 숫자, 불리언은 객체처럼 사용할 수 있지만 실제는 원시 데이터

사용할 수 있는 이유는 wrapper 객체로 감싸져 있기 때문


출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

표준 내장 객체의 확장

표준 내장 객체(Standard Buit-in Object)는 자바스크립트가 기본적으로 가지고 있는 객체들을 의미합니다. 내장 객체가 중요한 이유는 프로그래밍을 하는 데 기본적으로 필요한 도구이기 때문입니다. 자바스크립트가 갖는 내장 객체입니다.

Object, Function, Array, String, Boolean, Number, Math, Date, RegExp

자바스크립트가 동작하는 호스트환경이 제공하는 API는 많이 있습니다. 사용자가 직접 정의한 객체는 표준 내장 객체와 대비되는 개념입니다.



var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');

function getRandomValueFromArray(arr){

    var index = Math.floor(arr.length*Math.random()); //floor는 정수로 변환

    return arr[index]; //랜덤한 인덱스의 값을 리턴합니다.

}

console.log(getRandomValueFromArray(arr));

배열이 갖는 특정한 값을 랜덤하게 획득하는 기능을 모든 객체가 가질 수 있도록 코드를 변경해보겠습니다.

Array.prototype.rand = function(){

    var index = Math.floor(this.length*Math.random()); //배열 객체가 갖는 랜덤 메소드 안에서

    return this[index];                                       //this는 배열을 가리킵니다.

}

var arr = new Array('seoul','new york','ladarkh','pusan', 'Tsukuba');

console.log(arr.rand());

배열에 내장된 메소드인 것처럼 기능을 사용할 수 있습니다.

rand라는 메소드가 배열에 소속되어 있는 것이 분명해집니다. 훨씬 더 코드의 가독성이 높아집니다. rand의 메소드는 인자를 받지 않기 때문에 사용자가 신경 쓸 부분이 덜어집니다.

 

Object

Object는 데이터를 저장하는 그릇, 컨테이너라고 합니다.

Object가 갖는 역할은 객체를 prototype을 이용해 상속할 수 있습니다.

Object의 속성은 모든 객체의 property가 됩니다. 즉 모든 객체들의 부모입니다.

Object API 사용법에 대해 알아보겠습니다.

어떤 형태의 메소드가 있고 사용법에 대해 아는 것이 중요합니다.

Object.keys() // 키 값들을 리턴해주는 메소드

Object.prototype.toString() //

Keys()메소드는 배열 안의 인덱스, 키 값을 리스트로 리턴하는 메소드입니다.

toString() 객체가 담고 있는 값이 무엇인지 보기 좋게 출력해주는 메소드입니다.

new Object(); 객체를 생성하고 생성한 객체의 메소드 형태로 사용하는 것, Array Object를 자식이기에 toString() 메소드를 사용할 수 있습니다.

자바스크립트의 공동적인 최초의 조상이기 때문에 prototype이 있는 메소드는 모든 객체들이 상속받고 있는 공통의 기능입니다. 자바스크립트 애플리케이션 내 모든 객체들이 공통적으로 가져야 하는 기능이 있다면 기능은 object prototype객체 수정을 통해 이러한 기능을 만들 수 있습니다.

 

Object 객체를 확장해 모든 기능을 사용하는 방법에 대해 알아보겠습니다.

기능의 원리보다 어떻게 사용되고 어떤 취지에 기능인가에 살펴보고 기능을 구현하는 것이 좋습니다

 
Object.prototype.contain = function(neddle) { //건초 속 바늘 찾기의 의미를 가진 인자
    for(var name in this){
        if(this[name] === neddle){
            return true;
        }
    }
    return false;
}
var o = {'name':'egoing', 'city':'seoul'}
console.log(o.contain('egoing')); //true
var a = ['egoing','leezche','grapittie'];
console.log(a.contain('egoing')); //false
 

Object 확장의 위험에 대해 알아보겠습니다.

확장을 하는 이유는 모든 객체에 영향을 줄 수 있기 때문입니다. 신중해야 하는 이유는 모든 객체에 영향을 주기 때문입니다.

Console.log(o[name]); 시 함수의 값까지 나오게 됩니다.

o object이기 때문에 contain 메소드가 포함됩니다

for(var name in o){                                           for(var name in a){

    console.log(name);  //name, city, contain            console.log(name);  //0, 1, 2 , contain

}                                                                  }

Object의 어떠한 property나 메소드를 추가하는 것은 신중해야 합니다. 공통의 로직에 최소 단위에 적용해야 합니다. Object와 같이 모든 객체에 기능을 넣으면 모든 객체가 영향을 받기 때문에 편리하지만 위험해집니다.

for(var name in o){

    if(o.hasOwnProperty(name)){ //name에 대한 프로퍼티를 갖고 있다면

        console.log(name); 

    }

}

hasOwnProperty는 인자로 전달된 속성의 이름이 객체의 속성인지 여부를 판단합니다. prototype으로 상속 받은 객체라면 false가 됩니다.


출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

상속(Inheritance)

객체지향에서 중요한 개념입니다. 객체라는 것은 하나의 컨테이너이고 객체는 변수, 메소드로 모아져있습니다. 객체의 특성을 물려받아 새로운 객체를 만들수 있습니다. 새로운 객체는 부모 객체와 동일한 기능을 가질 수 있습니다. 부모의 기능을 그대로 사용하거나 추가할 수 있습니다. 이것이 바로 상속의 기본적인 동작 방식입니다. 이를 통해 로직을 재활용 할 수 있습니다.

부모의 재산을 자식이 상속받듯이 오리지널 객체의 기능을 동일하게 받을 수 있습니다.

function Person(name){

    this.name = name;

    this.introduce = function(){

        return 'My name is '+this.name;

    }  

}

var p1 = new Person('egoing');

document.write(p1.introduce()+"<br />"); // My name is egoing

 

function Person(name){ //생성자를 만들어서

    this.name = name;

}

Person.prototype.name=null; //객체의 prototype이라는 프로퍼티가 있는데 .name시 이름을 준다.

Person.prototype.introduce = function(){

    return 'My name is '+this.name;

}

var p1 = new Person('egoing');

document.write(p1.introduce()+"<br />");

자바스크립트의 상속 구현에 대해 알아보겠습니다.

function Person(name){

    this.name = name;

}

Person.prototype.name=null;

Person.prototype.introduce = function(){

    return 'My name is '+this.name;

}

 

function Programmer(name){

    this.name = name;

}

Programmer.prototype = new Person(); //상속받음

 

var p1 = new Programmer('egoing'); //Programmer생성자 호출

document.write(p1.introduce()+"<br />");

 

객체가 기능을 물려받았으니 새로운 기능을 추가하는 방법에 대해 알아보겠습니다.

Programmer.prototype.coding = function(){

    return "hello world";

}

document.write(p1.coding()+"<br />"); // hello world가 출력

 

function Designer(name){

    this.name = name;

}

Designer prototype = new Person();

Designer.prototype.design = function(){

    return "beautiful!";

}

var p2 = new Designer('leezche');

document.write(p1.introduce()+"<br />");

document.write(p1.design()+"<br />"); //beautiful!을 출력

 

prototype 원형(원래 형태)

객체지향 언어와 자바스크립트를 구분하는 개념

생성자는 기본적으로 함수입니다. 함수를 호출할 때 new로 인해 단순한 함수가 아닌 생성자로 변합니다. 새로운 객체를 만들어 리턴합니다. 어떤 객체를 만들 때 객체가 가져야 하는 메소드, 데이터가 주어지길 바라기 때문에 생성자를 사용합니다.

function Ultra(){}

Ultra.prototype.ultraProp = true;

 

function Super(){}

Super.prototype = new Ultra();

 

function Sub(){}

Sub.prototype = new Super();

Sub.prototype.ultraProp = 2;

var o = new Sub();

console.log(o.ultraProp); //true를 출력

sub객체는 ultraProp을 갖고 있지 않습니다. Sub의 부모인 super, super의 부모인 Ultra가 갖고 있습니다.

생성자는 기본적으로 함수입니다. 함수를 호출할 때 new를 붙이면 단순한 함수가 아닌 생성자 함수가 됩니다. 새로운 객체를 만들어 리턴합니다. o라는 변수는 sub()라는 생성자 함수에 의해 만들어진 객체입니다. 빈 객체를 만드는 것이 생성자라면 의미가 없습니다. 어떠한 객체를 만들 때 객체가 갖고 있어야하는 메소드, property값을 가져야합니다.

var o = new Sub();

//o.ultraProp = 1;

console.log(o.ultraProp); //2를 출력

1. 객체 o에서 ultraProp를 찾습니다..

2. 없다면 Sub.prototype.ultraProp를 찾습니다.

3. 없다면 Super.prototype.ultraProp를 찾습니다.

4. 없다면 Ultra.prototype.ultraProp를 찾습니다.

이는 객체와 객체를 연결하는 체인의 역할을 하는 것입니다. 이러한 관계를 prototype chain이라고 합니다.


출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

전역객체

모든 객체는 전역객체의 프로퍼티입니다. window라는 전역객체의 프로퍼티입니다.

function func(){                         var o = {'func':function(){

    alert('Hello?');                                alert('Hello?');

}                                            }}

func();                                     o.func();

window.func();                          window.o.func();

func(); window.func();는 모두 실행 가능합니다. 모든 전역변수와 함수는 사실 window 객체의 프로퍼티다. 객체를 명시하지 않으면 암시적으로 window의 프로퍼티로 간주됩니다.

 

this

객체지향에 대한 시야를 높이기 위한 수업입니다.

This는 함수 내에서 함수의 호출 맥락을 의미합니다. 의미가 고정에 되어 있지 않고 가변적일 때 맥락을 사용합니다. 함수와 객체의 관계가 느슨한 자바스크립트에서 this는 둘을 연결시키는 연결점의 역할을 합니다. 함수내의  this 값은 window를 의미합니다.

 

메소드와 this

var o = {

    func : function(){ //func 프로퍼티는 함수이기에 메소드입니다.

        if(o === this){

            document.write("o === this");

        }

    }

}

o.func();

객체 안에서 메소드를 호출하면 메소드가 소속되어있는 객체를 this로 접근할 수 있습니다.

func라는 함수가 객체에 소속되어 있지 않은 경우 this window라는 전역객체를 가리킵니다.

o.func() 호출 시 this o가 됩니다.

 

생성자와 this

생성자로 사용 될 때는 this값은 생성될 객체를 가리킵니다.

함수로 호출하면 함수 안의 this window를 가리킵니다.

var funcThis = null;

 

function Func(){

    funcThis = this;

}

var o1 = Func();

if(funcThis === window){

    document.write('window <br />'); //window

}

 

var o2 = new Func();

if(funcThis === o2){

    document.write('o2 <br />'); //o2

}

생성자는 빈 객체를 만듭니다. 그리고 이 객체내에서 this는 만들어진 객체를 가르킵니다. 이것은 매우 중요한 사실이다. 생성자가 실행되기 전까지는 객체는 변수에도 할당될 수 없기 때문에 this가 아니면 객체에 대한 어떠한 작업을 할 수 없기 때문입니다.

 

객체로서의 함수

apply, call

마지막의 인자가 함수의 본문에 해당

Sum()이라는 함수 객체를 만든 것, 문법적으로 작성해 자바스크립트가 함수 객체를 만들어줍니다.

이를 함수 리터럴(Literal)이라고 합니다. 문법적으로 리터럴이라고 부릅니다.

함수가 가질 수 있는 프로퍼티 중 ecma에서 정의한 것이 apply, call입니다.

 

var o = {}

var p = {}

function func(){

    switch(this){

        case o:

            document.write('o<br />');

            break;

        case p:

            document.write('p<br />');

            break;

        case window:

            document.write('window<br />');

            break;         

    }

}

func(); //window

func.apply(o); //o

func.apply(p); //p 객체p를 의미

ecma의 표준 메소드인 apply()

객체의 포함되어 있는 것이 메소드, 다른 곳에 가지 못하고 고정되어 있습니다.

자바스크립트는 유연하다.

언어에서 함수는 일반적인 객체지향의 메소드보다 위상이 높다. 어떻게 호출하느냐에 따라 함수는 어떠한 객체에 종속되는 존재이기도 합니다. This는 어떤 맥락에서 어떤 의미를 갖는가를 알아야합니다. this는 소속되어 있는 객체를 의미합니다.


 출처 : 생활코딩 강의

728x90
반응형
728x90
반응형

+ Recent posts