2019년 12월 23일
자바스크립트는 프로토타입 기반 객체지향 언어라고 불립니다. 그리고 여러분들은 한번 쯤은 __proto__
라는 Object를 본 적이 있을 것이고 그냥 지나치는 경우가 대다수일 것 입니다.
그러한 __proto__
가 무엇이고 자바스크립트가 prototype
기반 언어라는 이유를 알아보도록 하겠습니다.
자바스크립트에서 모든 객체는 부모(객체 원형)와 연결되어 있습니다. 그리고 객체 지향에서 상속 개념과 동일하게 부모의 프로퍼티와 메소드를 상속받아 사용할 수 있게 됩니다. 여기서 부모 객체를 Prototype 객체 또는 Prototype
이라고 부릅니다.
간단한 예제를 통해 알아봅니다.
var item = {
key: "key",
};
console.log(item);
// {
// key: "key"
// __proto__: { // item 객체의 Prototype(부모 객체) 정보
// constructor: ƒ Object()
// hasOwnProperty: ƒ hasOwnProperty()
// toString: ƒ toString()
// valueOf: ƒ valueOf()
// ...
// }
// }
console.log(item.hasOwnProperty("key")); // true
item 객체를 출력하여 __proto__
프로퍼티를 열어보면 자바스크립트의 Object 객체가 부모이며,
item 객체에서 선언하지 않은 hasOwnProperty 메소드를 상속받아 사용이 가능합니다.
위에서 생각할 수 있는 부분은 ‘아 __proto__
프로퍼티를 통하여 부모 객체에 접근할 수 있구나’라는 것을 알 수 있습니다.
모든 객체에는 인터널 슬롯(internal slot)
을 가지게 되는데, 인터널 슬롯이 바로 __proto__
프로퍼티 입니다.
__proto__
프로퍼티는 Prototype Link라고도 불리며, 자신의 부모객체(프로토타입 객체)의 prototype을 가리키게 됩니다.
var item = {};
console.log(item.__proto__ === Object.prototype); // true
__proto__
프로퍼티에 접근하면 내부적으로 Object.getPrototypeOf가 호출되어 프로토타입 객체를 반환합니다.
모든 객체는 언제나 함수(Function)으로 시작됩니다. 일반적으로 사용하는 객체 또한 아래처럼 함수형태입니다.
var item = {}; // literal 방식
var item = new Object();
그리고 함수가 정의될 때, 다음과 같은 일이 일어납니다.
Constructor의 자격이 부여되면 new를 통하여 객체를 만들어 낼 수 있습니다.
function item() {}
console.log(item.constructor); // ƒ Function() { [native code] }
Prototype Object
생성Constructor는 생성과 동시에 자신을 원형으로 하는 Prototype Object
라는 새로운 객체를 만들어냅니다.
Prototype Object
이란 객체 자신을 이용할 자식 객체들이 프로토타입으로 사용할 객체입니다.
그리고 자식 객체들은 __proto__
로 접근할 수 있게 됩니다.
var item = {};
console.log(item.__proto__ === Object.prototype); // true
item에서 프로토타입의 접근은 Object에서 생성된 Prototype Object
객체인 Object.prototype
와 동일합니다.
자바스크립트는 특정 객체의 프로퍼티나 메소드를 접근할 때 해당 객체에 접근하려는 대상이 없다면 __proto__
가 가르키는 링크를 따라 프로토타입 객체를 차례대로 검색하게 됩니다. 이것을 프로토타입 체인이라고합니다.
function item() {}
item.prototype.key = "itemKey";
var item2 = new item();
console.log(item2.key); // itemKey
자바스크립트의 모든 객체는 Object 객체의 프로토타입을 기반으로 확장되었기 때문에 모든 연결의 끝은 Object 객체의 프로토타입입니다.
개인적으로 상속을 활용한 코딩을 하면 좋을 것 같습니다.
function test() {
this.a = 1;
this.b = 2;
this.c = 3;
}
var A = new test();
var B = new test();
var C = new test();
위와 같이 선언한다면, new로 객체를 생성할 때 마다 내부 변수가 3개씩 할당됩니다.
이를 prototype를 활용하여 아래와 같이 코딩하게되면 별다른 선언 없이 변수를 상속받아 사용이 가능합니다.
function test() {}
test.prototype.a = 1;
test.prototype.b = 2;
test.prototype.c = 3;
var A = new test();
var B = new test();
var C = new test();
console.log(A); // test {}
console.log(A.a); // 1
console.log(B.a); // 1
console.log(C.C); // 3
A, B, C의 경우에는 test function의 prototype을 바라보고 있기 때문에 해당 데이터를 가져올 수 있게됩니다.
prototype은 면접다니다보면 항상 나오는 질문입니다. 그만큼 자바스크립트의 동작 원리를 위한 필수 개념입니다. 현재 배운 부분은 매우 일부라고 생각하며 계속 배우면서 추가해야겠습니다.
Javascript 기초 - Object prototype 이해하기
[Javascript ] 프로토타입 이해하기
[Javascript] 꼭 알아야 할 Prototype의 개념
프로토타입
2020년 01월 07일
스코프(Scope, 유효범위)에 대해서는 여러분들은 이미 사용하고 있을 것 입니다. 다만, 정확한 정의와 상세한 정보에 대해서 글을 통해 상세하게 알고 넘어가겠습니다. ## 스코프란? 특정한 변수(identifier)에 접근이 가능한가에 대한 규칙(범위)입니다. ```js var x = "global scope"; function foo() { var x = "function scope"; console.log(x); } foo(); // function scope console.log(x); // global scope ``` 위 예제에서 함수 foo 내 선언된 변수 x에 대해서는 foo 내에서만 참조가 가능하고 외부에서는 참조가 불가능하다. 이와같은 규칙들을 스코프라고 합니다. ## 스코프의 구분 스코프는 전역 스코프와 지역 스코프로 나눠집니다. #### 전역 스코프(Global Scope) 전역 변수(Global variable), 코드 어디에서든 참조할 수 있습니다. var로 선언한 전역 변수는 `전역 객체(Global Object) window`의 프로퍼티가 됩니다. #### 지역 스코프 (Local scope or Function-level scope) 지역 변수(Local variable), 지역(함수) 내에서 선언되어 함수 내에서 자신과 하위 함수에서만 참조 가능합니다. ## 자바스크립트 스코프 특징 자바스크립트는 `함수 레벨 스코프(function-level scope)`(함수 코드 블록 내에서 선언된 변수는 함수 코드 블록 내에서만 유효)를 따르고 있습니다. ```js var x =...
2020년 01월 06일
이전 프로젝트에서는 webpack을 eject하여 CSS module을 사용했지만, 이번 프로젝트에서는 eject 작업을 하지 않고 진행하기 때문에 방법을 찾아보았다. ## CSS Module 적응 전에는..? Module을 적용하지 않는다면, 최상단 App.jsx 또는 컴포넌트에서 scss 파일을 호출합니다. ```jsx // index.tsx or App.tsx import "./index.scss"; ``` 또한 클래스명이 기존 html처럼 class="container" 형태로 들어가기 때문에 css/scss 파일을 컴포넌트별로 생성했음에도 스타일 명이 충돌하는 불편함이 있습니다. ## 그렇다면 CRA에서 CSS Module은 어떻게 적용하지? css/scss 파일명을 module.css, module.scss로 변경합니다. 예를들어 index.scss는 `index.module.scss` 가 됩니다. 이후 컴포넌트에서는 다음과 같이 사용합니다. ```tsx import React from "react"; import styles from "./index.module.scss"; ... return ( ) ... ``` scss는 기존처럼 사용하시면 되며, `id, class`의 컴파일 결과를 확인하시면 scss 파일의 이름 혹은 폴더 이름으로 유니크하게 생성된 것을 확인할 수 있습니다. 아래는 컴파일 결과의 예시입니다. ```tsx // components/Pages/index.module.scss #loginPage { display: block; } // components/Pages/LoginPage.tsx import styles from "./index.module.scss" ... return ( ); => ```
2019년 12월 19일
Google Search Console에서는 Google 검색에 콘텐츠를 표시하기 위한 실행 가능 보고서, 도구, 학습 리소스를 제공합니다. Link Google Search Console에서 봇이 데이터를 가져가기 위해 sitemap과 robots의 설정이 필요하며, 먼저 설명드리겠습니다. 작성 당시 jekyll 버전은 3.8.6 입니다. Jekyll Sitemap 설치 gem jekyll-sitemap 설치 gem install jekyll-sitemap Gemfile 설정 # GemFile group :jekyll_plugins do gem "jekyll-sitemap" _config.yml 수정 # _config.yml plugins: - jekyll-sitemap 이제 도메인 뒤에 /sitemap.xml를 붙여 설정된 것을 확인합니다. ex) https://minhyeong-jang.github.io/sitemap.xml robots.txt 설정 Bot에게 현재 사이트의 sitemap과 권한 설정 등을 제공합니다. User-agent: * Allow: / Sitemap: https://minhyeong-jang.github.io/sitemap.xml Google Search Console 생성 이제 마지막으로 Google Search Console 홈페이지에서 속성을 생성합니다. 도메인 / URL 접두어로 나눠져있는데, 따로 Github Pages에 도메인을 설정하지 않은 경우 URL 접두어를 선택합니다. 선택 후에는 설명에 따라 인증을 진행합니다. ( 이전에 작성한 anlytics를 진행하신 분은 바로 인증이 가능합니다. ) Sitemaps 탭으로 이동하여 새 사이트맵에 생성한 sitemap.xml URL을 입력하여 제출합니다. 제출에 성공한 경우 정상적으로 완료된 것 입니다.