λ¬Έμ λͺ©λ‘μΌλ‘ λμκ°κΈ°
π‘μ§μμλ΅μ https://github.com/pul8219/TIL
Issues
νμ μλ§μ step μ΄μμμ λ¨κ²¨μ£ΌμΈμ. β‘οΈ IssueνμΌλ‘ μ΄λ
- μμ±μ: Wol-dan (@pul8219)
- μ€ν°λ μ£Όμ : FrontEnd λ©΄μ μ€ν°λ https://gitlab.com/siots-study/topics/-/wikis/home
- κ³΅λΆ λ²μ: Class μ 체
- κΈ°ν: 8/22(ν ) ~ 8/25(ν)
-
μλ°μ€ν¬λ¦½νΈμ μμ±μ new
-
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° μΈμ΄ prototype νλ‘νΌν°?
-
let{...} = ?; μ΄λ° λ¬Έλ²!
-
ꡬ쑰 λΆν΄ ν λΉ?
-
${} λ¬Έλ² $ {} ννμμ μ²λ¦¬λ κ°μ λ¬Έμμ΄λ‘ λ°ννλ€. -
μ격 λͺ¨λ
-
κ°μ²΄λ₯Ό λ§λ€ λ functionμ΄ μκΈ΄λ€λ κ²? - Object Function{}
-
ν΄λμ€μ νΈμ΄μ€ν μ μ΄λ»κ² λλ?mdnμμ μλλΌνκ³ λ€λ₯Έ μλ£μμ λ§μ λλ€κ³ νκ³ νΌλ...
(μλ λ΄μ©μ MDNμ λμμλ μ€λͺ μ μ΄ν΄νλ©° μ 리νλ€.)
-
μλ°μ€ν¬λ¦½νΈλ κ°μ²΄μ μνμΈ prototypeμ μ΄μ©νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ prototype κΈ°λ° μΈμ΄μ΄λ€. 'μμ'μ΄λ κ°λ μ΄ μ‘΄μ¬νμ§ μλλ€. λ€λ§ μλ°μ€ν¬λ¦½νΈλ ν΄λμ€μ λΉμ·νκ² λμνκ²λ νλ΄λ΄λ μ¬λ¬ κΈ°λ²λ€μ κ°μ§κ³ μλ€. (ES6μμ
class
ν€μλκ° λμ λμ§λ§ μ΄λ μ¬μ©νκΈ° μ½κ² νκΈ°μν΄ λμ λ κ²μΌλΏ μλ°μ€ν¬λ¦½νΈλ μ¬μ ν prototype κΈ°λ°μ μΈμ΄μ΄λ€. λ°λΌμ ν΄λμ€ κΈ°λ° μΈμ΄μΈ Javaμ C++ λ₯Ό λ€λ£¨λ κ°λ°μμκ² μλ°μ€ν¬λ¦½νΈμ μ΄λ¬ν λ°©μμ λ€μ λΉν©μ€λ½κ² λκ»΄μ§ μ μμJS μ°Έ μμλ‘ κΆκΈν μΉκ΅¬) -
μμμ κ΄μ μμ μλ°μ€ν¬λ¦½νΈμ μ μΌν μμ±μλ 'κ°μ²΄'λΏμ΄λ€. κ°κ°μ κ°μ²΄λ [[Prototype]]μ΄λΌλ private μμ±μ κ°μ§λλ° μμ μ prototypeμ΄ λλ λ€λ₯Έ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€. λν κ°κ° κ°μ²΄λ€μ μμ μ prototype(μνμ΄λΌκ³ μ΄ν΄)λ₯Ό κ°μ§κ³ μλ€.
-
κ°μ²΄μ prototypeμ λ€λ₯Έ prototype κ°μ²΄λ₯Ό λ°λΌλ³΄κ³ , μ΄κ²μ΄ λ°λ³΅(prototype chain)λλ€κ° prototypeμ΄
null
μΈ κ°μ²΄μμ λμ΄ λλ€.null
μ λμ΄μμ prototypeμ΄ μλ€κ³ μ μλλ©°, prototype chainμ μ’ μ μν μ νλ€. -
μλ₯Ό λ€μ΄, μλ°μ€ν¬λ¦½νΈμ λͺ¨λ κ°μ²΄λ€μ prototype chain μ΅μμμ μλ
Object
μ μΈμ€ν΄μ€λ€λ‘ μ΄ν΄ν μ μλ€.
prototype μ΄ν΄μ λμμ΄ λ§μ΄ λ μλ£ https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67
- ES6 μ΄μ κΉμ§λ λΉμ·ν μ’ λ₯μ κ°μ²΄λ₯Ό λ§μ΄ λ§λ€μ΄λ΄κΈ° μν΄ μμ±μλ₯Ό μ¬μ©ν΄μμ
- ES6μμ ν΄λμ€ λ¬Έλ²μ΄ μΆκ°λ¨
- ES6μμλ μΌμ λΆλΆμ νλ‘ν νμ μ νμ©νκ³ μκΈ° λλ¬Έμ, ES5μ μλ ν΄λμ€λ₯Ό νλ΄λ΄κΈ° μν(classalike) ꡬν λ°©μμ μκ³ μλ κ²μ΄ μ’μ
- ν΄λμ€λ νΈμ΄μ€ν
μ΄ λμ§λ§
uninitialized
λ‘ μ΄κΈ°νλκΈ° λλ¬Έμ μ μΈ μ μ μ¬μ©νλ €κ³ νλ©΄ Reference Errorκ° λ°μνλ€. - ν΄λμ€μ bodyλ μ격λͺ¨λ(strict mode)λ‘ μ€νλλ€.
- Classμ bodyμμλ λ©μλλ§ μ μΈ κ°λ₯νλ€.(λ©€λ²λ³μλ μ μΈ λΆκ°)
- JSμμ ν΄λμ€λ νΉλ³ν ν¨μμ΄λ€
- prototype κΈ°λ°μ μμ νλ΄?λ³΄λ€ λͺ λ£νκ³ νΈμλκ² μ¬μ©ν μ μλλ‘ λ¬Έλ²μ μ 곡νμ¬ Syntatic Sugar λΌ ν¨
// μ΄μ μ μ¬μ©νλ μμ±μ ν¨μ λ°©μ
// κ΄λ‘μ μμ±μ ν¨μμ 첫 λ¬Έμλ λλ¬Έμλ‘ νκΈ°!
function Book(title, writer) {
this.title = title;
this.writer = writer;
}
var book1 = new Book('λ°μΉΈλ°λ', 'μ¬νκ°');
var book2 = new Book('μΌμ½μ λ―Έμ', 'μ΅μμ');
console.log(book1.title + '-' + book1.writer);
console.log(book2.title + '-' + book2.writer);
// ν΄λμ€ λΈλ‘μμλ λ³λμ λ¬Έλ²μΌλ‘ μ½λλ₯Ό μμ±ν΄μΌνλ€. ν¨μ νΉμ κ°μ²΄ λ΄λΆμμ μ¬μ©νλ λ¬Έλ²κ³Ό ν·κ°λ¦¬μ§ μλλ‘ μ£Όμν κ²
class Person{
console.log('hello');
}
// μλ¬: Unexpected token
class Person{
name: "nana",
email: "[email protected]"
}
// μλ¬: Unexpected token
- class μ μΈμ
// Class μ μ λ°©λ² - 1. ν΄λμ€ μ μΈ
class Book(){
constructor(title, writer){
this.title = title;
this.writer = writer;
}
}
- class ννμ
- μ΅λͺ μ classλ μ μ κ°λ₯
// Class μ μ λ°©λ² - 2. ν΄λμ€ ννμ
// μ΅λͺ
(unnamed) ν΄λμ€ μ μΈ μμ
let Book = class {
constructor(title, writer) {
this.title = title;
this.writer = writer;
}
};
const book1 = new Book('μΌμ½μ λ―Έμ', 'μ΅μμ');
console.log(book1.title); // "μΌμ½μ λ―Έμ"
// μ΄λ¦μ κ°λ ν΄λμ€
let Book = class Book1 {
constructor(title, writer) {
this.title = title;
this.writer = writer;
}
};
console.log(Book.name); //"Book1"
MDN μΆμ² A class expression is another way to define a class. Class expressions can be named or unnamed. The name given to a named class expression is local to the class's body. (it can be retrieved through the class's (not an instance's) name property, though). 첫 λ¬Έμ₯ λΉΌκ³ λ¬΄μ¨ μλ―Έ?
new
μ°μ°μμ ν¨κ» constructor(μμ±μ)λ₯Ό νΈμΆνλ€.new
μ°μ°μ μμ΄ constructorλ₯Ό νΈμΆνλ©΄ νμ μλ¬κ° λ°μνλ€.
class Foo {}
const foo = new Foo(); // newλ₯Ό ν΅ν΄ μΈμ€ν΄μ€ μμ±
console.log(Foo === Foo.prototype.constructor); //true
= Constructor
- μμ±μ λ©μλλ κ°μ²΄μ μμ±κ³Ό μ΄κΈ°νλ₯Ό νλ νΉλ³ν λ©μλλ‘ ν΄λμ€ λ΄μ constructor μ΄λ¦μ κ°λ λ©μλλ νλμ¬μΌνλ€.
- constructorλ μΈμ€ν΄μ€ μμ±κ³Ό λμμ ν΄λμ€ νλ‘νΌν°μ μμ±κ³Ό μ΄κΈ°νλ₯Ό μ€ννλ€.
class Foo {} //constructorλ₯Ό μλ΅νλ©΄ constructor() {}κ° μλμΌλ‘ ν¬ν¨λ κ²μ²λΌ λμνλ€.
const foo = new Foo();
console.log(foo); // Foo {}
foo.num = 1; // ν΄λμ€ νλ‘νΌν°μ λμ ν λΉ λ° μ΄κΈ°νκ° κ°λ₯νλ€
console.log(foo); // Foo { num: 1 }
// Getter, Setter
class Foo {
constructor(bar) {
this.bar = bar;
}
get met() {
return this.bar;
}
set met(newBar) {
this.bar = newBar;
}
}
let foo = new Foo('hello');
console.log(foo.bar); // "hello"
console.log(foo.met); // "hello"
foo.met = 'hi';
console.log(foo.met); // "hi"
ν΄λμ€ λΈλ‘ μμμ ν λΉ μ°μ°μ(=)λ₯Ό ν΅ν΄ μΈμ€ν΄μ€ μμ±μ μ§μ ν μ μλ λ¬Έλ²(μμ§ μ μ νμ€μΌλ‘ μ±νλ κΈ°λ₯μ μλ)
ν ν΄λμ€λ₯Ό λ€λ₯Έ ν΄λμ€κ° μμνμ¬ λ€λ₯Έ ν΄λμ€μμ μ¬μ¬μ©ν μ μμ
- μμ ν΄λμ€λ₯Ό ν΅ν΄ λΆλͺ¨ ν΄λμ€μ μ μ λ©μλμ μ μ μμ±μ μ¬μ©ν μ μλ€.
- λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€ λ©μλμ μΈμ€ν΄μ€ μμ±μ μμ ν΄λμ€μ μΈμ€ν΄μ€μμ μ¬μ©ν μ μλ€.
// μμ
class animal {
// λΆλͺ¨ ν΄λμ€ Animal
static region = 'KR';
static jump() {
console.log('jump!');
}
stop() {
console.log('stop');
}
}
class cat extends animal {
// μμ ν΄λμ€ Cat
}
cat.jump(); // μμν΄λμ€λ₯Ό ν΅ν΄ λΆλͺ¨ν΄λμ€μ μ μ λ©μλ μ¬μ© κ°λ₯
console.log(cat.region); // μμν΄λμ€λ₯Ό ν΅ν΄ λΆλͺ¨ν΄λμ€μ μ μ μμ± μ¬μ© κ°λ₯
let c = new cat();
c.stop(); // μμν΄λμ€μ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ λΆλͺ¨ν΄λμ€μ μΈμ€ν΄μ€ λ©μλμ μΈμ€ν΄μ€ μμ±μ μ¬μ© κ°λ₯
μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€μ μλ μμ±κ³Ό κ°μ μ΄λ¦μ μμ±μ΄ μλ κ²½μ° λ¬Έμ κ° λ μ μλλ°, super
λ₯Ό μ°λ©΄ λΆλͺ¨ ν΄λμ€μ λ©μλμ μ§μ μ κ·Όν μ μλ€.
super
ν€μλμ λμ λ°©μ TODO
// super
class writing {
getMedia() {
return 'book';
}
}
class essay extends writing {
getMedia() {
return super.getMedia() + ' or brunch';
}
}
let e = new essay();
console.log(e.getMedia()); // "book or brunch"
TODO
νμ± https://github.com/khw970421/js-interview/blob/master/const/project6.js
μ μ https://jeongshin.github.io/JeongShin_Blog/TIL/study/JavaScript.html#step-6
λ Έμ https://github.com/quavious/hell_script/blob/master/chapter6.js
μ λ¦Ό
Q. μ μ½μμ΅λλ€. μ λ μ΄λ²μ£Ό μ°μ₯ν΄μ μμ§ κ³΅λΆκ° λ λμ΄μλ μνμΈλ° νμ±λκΊΌ μ 보λκΉ μ΄ν΄λ λκ³ λμλ λ§μ΄ λμ΅λλ€. κ°μ²΄κ° μ°Έμ‘°λμ΄ κ°μ΄ κ°μ΄ λ³κ²½λλ κ²½μ°λ μμκ°λλ€
console.log(objA1.x); //κ°μ²΄λ₯Ό 볡μ¬νλ―λ‘ 10μ λ³νμ§μκ³ 10μΌλ‘ μΆλ ₯
νΉμ μ λΆλΆμμ κ°μ²΄λ₯Ό 볡μ¬νλ€λ ννμ΄ λ§λ κ²μΈκ°μ? μλλ©΄ κ°μ²΄μ x νλ‘νΌν°μ κ°λ§ 볡μ¬νλ κ²μΈκ°μ? (μ κ° js μμ΄λ³΄λΌμ μ¬μμ΄λ΄ λλ€...)
+++ μ€λ²μμΉλΌλ... @eyabc μ’μνμ€ μ€μν μμλ€μ γ γ γ γ μ μ ν©λλ€ π
A. console.log(objA1.x) //κ°μ²΄λ₯Ό 볡μ¬νλ―λ‘ 10μ λ³νμ§μκ³ 10μΌλ‘ μΆλ ₯
μ΄λΆλΆ κ°μ κ²½μ°λ μ ννλ μ κ° μ‘°κΈ μ€λͺ μ΄ λΆμ‘±νκ³ μλͺ»λκ²κ°μ΅λλ€. pul8219λ λ§λκ³ κ°μ²΄μ xμ κ°μ΄ 볡μ¬λλ€κ³ μ€λͺ νλκ²μ΄ λ§λ€κ³ μκ°ν©λλ€. λ°λΌμ μ ννλ
let objA1={ x:10 } let value=objA1.x; //κ°μ²΄ xμ νλ‘νΌν° κ° μ체λ₯Ό 볡μ¬νμ¬ valueμ μ μ₯(μ°Έμ‘° x) value=100; //valueμ μ μ₯λ κ° 10μ 100μΌλ‘ μμ console.log(objA1.x) // objA1.xλ valueμ λ³νμ μν₯μ΄ μμ΄ κ°μ 10μΌλ‘ μ μ§ μ΄κ² λ§λ€κ³ μκ°ν©λλ€. μ λ μμ μ νΌλλ°±ν΄μΌκ² λ€μ κ°μ¬ν©λλ€.
μ λ΄€μ΅λλ€. μ½λλ‘ λ€μν μμ λ₯Ό λ³Ό μ μμ΄μ μ’μ κ² κ°μμ. 곡λΆκ° λ νμν΄μ μμΈν건 @eyabc λμ μμ μ§λ¬Έ&λ΅λ³ λ³΄κ³ λ§μ΄ λ°°μ°κ² μ΅λλ€.
Step6 μ μ½μμ΅λλ€!
ν΄λμ€μ μ λ°μ μΈ λ΄μ©, ν΄λμ€λ νΈμ΄μ€ν μ΄ λλ€λ μ , κ·Έλ¦¬κ³ μμ, super λ±μ λ΄μ©μ μ μ΄ν΄ν μ μμμ΅λλ€. μμ΄ μ λ§ λ°©λνλ€μπ μ΄λ κ² λμ μ§μ λ¬Έμλ₯Ό μν΄μ μ λ 미리미리 νκ³ μκ°ν¬μλ₯Ό λ ν΄μΌκ² μ΅λλ€
μ€μΌ 리뷰)
μ μ λ©μλμμλ thisλ₯Ό μ¬μ©ν μ μμ΅λλ€.
class Foo {}
Foo.a = 10;
Foo.b = 20;
Foo.c = function () {
return this.a + this.b;
};
console.log(Foo.c()); // 30
-
μ°Έκ³ λ‘ private νλμ λ©μλλ μμλμ§ μμ΅λλ€ μλ νμ ν΄λμ€μμ μμ ν΄λμ€μ νλμ λ©μλμ μ κ·ΌνκΈ° μν΄μ protected λΌλ μ κ·Όμ νμλ₯Ό μ¬μ©ν©λλ€. κ·Έλ°λ° JSμλ privateλ§ μκ³ protectedκ° μκΈ° λλ¬Έμ privateμΌλ‘ μ μΈλ κ²μ μμ μμλμ§ μμ΅λλ€.
μ°Έκ³ λ‘ superλ νμ μμ±μ μ΅μλ¨μμ μ¬μ©λμ΄μΌν©λλ€. superλ³΄λ€ μμ μλ κ΅¬λ¬Έμ΄ μμ κ²½μ° μλ¬κ° λ°μν©λλ€.
- ES5μ ES6κ° μ νν μ΄λ»κ² λ€λ₯Έμ§ μ€λͺ νλ κΈμ λλ€.
https://www.bsidesoft.com/5370
ν΅μ¬μ λ°λ‘ "μμ" μ λλ€.
ES5λ‘ ES6μμ μ¬μ©νλ μμμ μλ²½νκ² νλ΄ λ΄λ κ²μ λΆκ°λ₯ν©λλ€.
https://poiemaweb.com/es6-class
https://medium.com/@bluesh55/javascript-prototype-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-f8e67c286b67