ํจ์ ์์ฑ์(Constructor Functions)๋?
ํจ์ ์์ฑ์๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ 'ํด๋์ค'์ ๋์์ด๋ค. ์ด๋ค ๊ฒฝ์ฐ ์ฌ๋๋ค์ ์ฐธ์กฐ ํ์ (Reference Types), ํด๋์ค(Classes), ๋ฐ์ดํฐ ํ์ , ์๋๋ฉด ๊ฐ๋จํ๊ฒ ์์ฑ์๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํด๋์ค์ ์์ง ์ต์ํ์ง ์๋ค๋ฉด, ์ด๋ค ์์ฑ(properties)๊ณผ ํ๋(functions)์ ์ ์ํ๋๋ก ํด์ฃผ๊ณ , ๊ทธ ์์ฑ๊ณผ ํ๋์ ํตํด ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์ ์๋๋ก ํด์ฃผ๋ ์์ฑ์๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค. ํด๋์ค๋ ๊ฐ์ฒด๋ก์ ์ง์ ์ง๊ธฐ ์ํ ์ฒญ์ฌ์ง์ด๋ผ๋ ๋น์ ๋ฅผ ๋ง์ด ํ๋ค. ์ฌ๋ฌ ์ง์ด ๋จ ํ๋์ ์ฒญ์ฌ์ง์ผ๋ก๋ถํฐ ์์ํ๋ ๊ฒ์ฒ๋ผ, ์ฌ๋ฌ ๊ฐ์ฒด๋ ๋จ ํ๋์ ํด๋์ค๋ก๋ถํฐ ์์ฑ๋ ์ ์๋ค.
function Person(name, position) {
this.name = name,
this.position = position
}
ํจ์ ์ด๋ฆ์ ์๋ฌด๋ ์๋์ง๋ง ๋๋ฌธ์๋ก ์์ํ๋ ๊ฒ์ด naming convention์ผ๋ก ์๋ฆฌ์ก์๋ค. ๋, ๋ณดํต ํจ์๋ ๊ดํธ์ ํจ๊ป ํธ์ถํ๊ณ ์์ฑ์ ํจ์๋ new
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
const hannah = new Person('Hannah Yoo', programmer)
const jisoo = new Person('Jisoo Han', 'student')
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ Person
์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ ๊ฐ ์์ฑํ๊ณ ์๋ค.
new
ํค์๋์ ํจ๊ป ์์ฑ์ ํจ์๊ฐ ํธ์ถ๋ ๋, this
๋ ์์ฑ๋๊ณ ์๋ ๋ฐ๋ก ๊ทธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค.
Methods
๋ฉ์๋๋ ์์ฑ์ ํจ์ ์์์ ์์ฑ์ ํจ์๋ฅผ ํ ๋นํ๋ฉด์ ์ ์๋๋ค.
function Person(name) {
this.name = name;
this.hi = function () {console.log(`Hi, My name is ${this.name}`)}
}
const hannah = new Person('Hannah Yoo');
hannah.hi(); // Hi, My name is Hannah Yoo
์ฌ๊ธฐ์ hi
์์ฑ์ ํ ๋น๋ ํจ์์ด๋ค. Person
๊ฐ์ฒด๊ฐ ํธ์ถ๋ ๋ this
ํค์๋๋ ์๋ก ์์ฑ๋ Person
๊ฐ์ฒด์ ์๋ตํ ๊ฒ์ด๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก ๋ฉ์๋๊ฐ ์ ์๋๋ค ํด๋ ์ด๋ฐ ์ ๊ทผ๋ฒ์ ์ฝ๊ฐ ๊ท์ฐฎ๋ค. Person
์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ๊ทธ ๊ฐ์ฒด์ hi
ํ๋กํผํฐ์ ์๋ก์ด ํจ์๊ฐ ์ ์๋๊ณ , ํ ๋น๋๋ค. ๋ง์ผ ์ฐ๋ฆฌ๊ฐ 5๊ฐ์ Person ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค์น๋ฉด, ๊ฐ์ ๋ชจ๋๊ฐ ๊ฐ์ ์ผ์ ํ๋ ์์ ๋ง์ hi ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ hi ์์ฑ์ ๋จ ํ ๋ฒ๋ง ์ ์ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ Person ๊ฐ์ฒด๋ ๊ฐ์ ํจ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๋ค. ์ด๋ฅผ ์ํด์๋ ํจ์์ prototype
์ ์จ๋ณผ ์ ์๋ค.
function Person(name) {
this.name = name;
}
Person.prototype.hi = function () {
console.log('hi my name is' + this.name)
}
const hannah = new Person('Hannah Yoo')
const jisoo = new Person('Jisoo Han')
hannah.hi();
jisoo.hi();
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ํจ์๋ 'prototype
'์ด๋ผ๊ณ ํ๋ ์์ฑ์ด ์๋๋ฐ,์ด๋ ๊ฑฐ์ ๋น ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ค ๋งํ ์ ์๋ค. Person
์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋๋ง๋ค ์ด ๊ฐ์ฒด๋ Person.prototype
์ ์ ์ธ๋ ์ด๋ค ์์ฑ์ด๋ , ๋ฉ์๋๋ ์์๋ฐ๊ฒ ๋๋ค.
์ ์์๋ฅผ ์๋์ฒ๋ผ ์ ์ ์๋ ์๋ค.
function Person(name) {
this.name = name;
}
Person.prototype = {
constructor: Person,
hi() {
console.log('hi my name is' + this.name)
}
}
์ฌ๋ฌ ๋ฒ Person.prototype
์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๊ทธ๋ฅ Person.prototype
๊ฐ์ฒด๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ ๋ซ๋ค. ์์ prototype์ด ๊ฑฐ์ ๋น ๊ฐ์ฒด๋ผ๊ณ ์ธ๊ธํ๋๋ฐ, ์ ํํ๊ฒ ๋งํ์๋ฉด, prototype
์ constructor
๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๊ณ , ์ด๋ ์์ฑ์ ํจ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ฐ๋ฆฌ๊ฐ ์์ ํ ์๋ก์ด ๊ฐ์ฒด๋ก prototype
์ ๋ฎ์ด์์ด๋ค๋ฉด, ์ด constructor
์์ฑ๋ resetํด์ผ ํ๋ค.
์ Prototype์ ์จ์ผ ํ๋ ๊ฑธ๊น?
prototype
์์ ๊ทธ ์ด๋ค ๊ฒ์ด๋ ๋ชจ๋ ํด๋น ์์ฑ์ ์ธ์คํด์ค ๊ฐ์ฒด ์ฌ์ด์ ๊ณต์ ๋๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ prototype
์ ์ ์ธ๋ ๋ฉ์๋๋์ง ์์ฑ์ ๊ฐ์ฒด ์์ ์ ์ฅ๋ ์์ฑ๋ง์ ๋ณด๊ณค ํ๋ค. ๋ฉ์๋๋ ๊ณต์ ๋ ํ๋์์์ผ๋ก ๊ฐ ๊ฐ์ฒด๋ ์์ ๋ง์ ์ ์ผํ ๋ฉ์๋๊ฐ ์๋ค. ํ์ง๋ง, ๊ฐ ๊ฐ์ฒด๋ ์์ ๋ง์ ์์ฑ์ ๊ฐ์ ธ์ผ ํ ๋๋ ์๋ ๋ฒ์ด๋ค. prototype
์ด ์๋๋ผ ๊ฐ์ฒด ์์ฒด์ ์ ์๋ ์์ฑ์ "own properties
"๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
ES6 classes
ES6 ๋๋ถ์ ์ฐ๋ฆฌ๋ ์ ์์ฑ์ ํจ์๋ฅผ class ๋ฌธ๋ฒ์ผ๋ก ์ธ ์ ์๊ฒ ๋์๋ค.
class Person {
constructor(name) {
this.name = name;
}
hi() {
console.log('..')
}
}
์ฌ๊ธฐ์ hi()
๋ Person.prototype
์ ์ ์ฅ๋๋ค.
Property Lookups
๋ง์ผ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด์ ์์ฑ์์ prototype์ ๊ฐ์ ์ด๋ฆ์ ์์ฑ์ ์ ์ธํ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊น?
function Person(name) {
this.name = name;
this.walk = function () {
console.log('moon walking')
}
}
Person.prototype.walk = function () {
console.log('normal walking')
};
const mj = new Person('Michael Jackson');
mj.walk();
์ด ์์ ์์๋, walk
์ด๋ผ๋ ๋ฉ์๋๊ฐ Person ์ธ์คํด์ค์ Person.prototype์ ๊ฐ๊ฐ ์ ์ธ๋์๋ค. ์ฝ์์๋ ๋ญ๋ผ๊ณ ์ฐํ๊น?
JavaScript๋ ์ฐ์ ๊ฐ์ฒด ์์ ์ "own property"๋ถํฐ ์ฐพ์ผ๋ ค ํ๋ค. ๋ง์ผ own property๊ฐ ์กด์ฌํ๋ค๋ฉด, ํด๋น ์์ฑ์ด ์ฌ์ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ํด๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ ํจ์์ prototype
์ ์ฐพ์๋ณด๋ ค ํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ ์์ ์์๋ mj
๊ฐ์ฒด ์์ฒด์์ walk
๊ฐ ๋ฐ๊ฒฌ๋๊ณ , ์ฝ์์๋ 'moon walking'์ด ์ฐํ ๊ฒ์ด๋ค. ๋ง์ผ Person
๊ฐ์ฒด๊ฐ ์๋์ฒ๋ผ ์๊ฒผ๋ค๋ฉด, ๊ฐ์ฒด ์์ฒด์ walk ๋ฉ์๋๊ฐ ๋ฐ๊ฒฌ๋์ง ์์ผ๋, ์๋ฐ์คํฌ๋ฆฝํธ๋ walk
๋ฉ์๋๊ฐ ๋ฐ๊ฒฌ๋๋ Person.prototype
์ ์ฐพ๊ฒ ๋๊ณ , 'normal walking'์ด ์ฝ์์ ์ฐํ ๊ฒ์ด๋ค.
function Person(name) {
this.name = name;
}
์์
๋ง์ผ ํด๋์ค ๊ธฐ๋ฐ์ ์ธ์ด๋ฅผ ๊ณต๋ถํ ์ฌ๋์ด๋ผ๋ฉด, ์์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ถ๊ธํ ๊ฒ์ด๋ค. Animal์ด๋ผ๋ ์์ฑ์๊ฐ ์๋ค๊ณ ํด๋ณด์.
function Animal() {}
Animal.prototype.eat = function () {
console.log('eating')
};
์ด๋ฒ์๋ Cat ์์ฑ์๊ฐ ์๋ค๊ณ ํด๋ณด์.
function Cat() {
Cat.prototype.meow = function () {
console.log('meowing');
}
};
Cat์ ๋๋ฌผ์ ํ ์ข ๋ฅ์ด๋, Animal๋ก๋ถํฐ ํ์ฅ๋ Cat์ ๊ฐ๊ณ ์ ํ๋ค. ์์์ ํ๊ธฐ ์ํ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
function Animal() {}
Animal.prototype.eat = function () {
console.log('eating')
}
function Cat(){}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
Cat.prototype.meow = function () {
console.log('meowing');
}
์์ ์ ํด๋์ค ๊ธฐ๋ฐ์ ์ธ์ด๋ฅผ ์ฌ์ฉํ ์ ์ด ์๋ค๋ฉด, ๋ถ๋ช ์ด ๋๋ชฉ์์ ์ด๊ฒ ๋์ฒด ๋ญ๊ฐ ํ๊ณ ์๊ฐํ ๊ฒ์ด๋ค. ๊ต์ฅํ ํฌ๋ฐํด๋ณด์ด์ง ์๋. ๊ฐ์ฌํ๊ฒ๋ ES6/ES2015์ ํด๋์ค๊ฐ ์ด ๊ณผ์ ์ ํจ์ฌ ๊น๋ํ๊ฒ ๋ง๋ค์ด์ฃผ์๋ค.
class Animal {
eat() {
console.log('eating')
}
}
class Cat extend Animal () {
meow() {
console.log('meowing')
}
}
Native Constructor Functions & Their Shorthand (literal) Conterparts
์๋ฐ์คํฌ๋ฆฝํธ๋ Stirng
, Number
, Boolean
, Array
, Function
, Object
, RegExp
, Date
๋ฅผ ํฌํจํด์ ์์ฑ์์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋ฌ ๋นํธ์ธ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
const str = new String('some string');
// OR
const str = 'some string'; // literal syntax
const age = new Number(25);
// OR
const age = 25; // literal syntax
const person = new Object();
// OR
const person = {}; // literal syntax
const x = new Boolean(false);
const x = false; // literal syntax
const add = new Function('a', 'b', 'return a+b');
const add = function (a, b) {
return a + b;
}; // literal syntax
๋ค์ดํฐ๋ธ ์์ฑ์๋ฅผ ํตํด numbers, strings, objects, booleans, functions๋ฅผ ์์ฑํ๋ค๊ณ ํด๋ ์ธ์ ๋ ๋ฆฌํฐ๋ด ์ ํ์ค๊ฐ ๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ด๋ค.
Extending Native Constructors
๋ค์ดํฐ๋ธ ์์ฑ์ ํจ์๋ ํ์ฅ๋ ์ ์๋ค. ์ปค์คํ String ๋ฉ์๋๋ฅผ ๋ง๋ ํ์, ๋ฏธ๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ ๋ฉ์๋๋ฅผ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ implementํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ์์ํ ๋๋ก ์๋ํ์ง ์์ผ๋ ๊ทธ๋ค์ง ์ถ์ฒ๋๋ ๋ฐฉ๋ฒ์ ์๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , prototype๋ฅผ ์ดํดํ๊ธฐ ์ํด์ ๋ฐฐ์๋ณผ ๋งํ ๊ฐ์น๋ ์๋ค.
String.prototype.dasherize = function () {
return this.replace(/\s/g, '-');
}
'hello world'.dasherize(); // hello-world
ํด๋์ค๋?
ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ผ์ข ์ ํ ํ๋ฆฟ์ด๋ค. ํด๋์ค๋ ๋ฐ์ดํฐ๋ฅผ ์์ถํ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋์ค๋ prototype์ ๊ธฐ๋ฐํ์ง๋ง, ES5์ ํด๋์ค ๊ฐ์ ์๋งจํฑ๊ณผ ๊ณต์ ๋์ง ์๋ ๋ฌธ๋ฒ๊ณผ ์๋งจํฑ์ ๊ฐ์ง๋ค.
ํด๋์ค๋ฅผ ์ ์ํ๊ธฐ[์ ์ธํ๊ธฐ]
ํจ์ ํํ์๊ณผ ํจ์ ์ ์ธ์์ ์ ์ธํ๋ ๊ฒ์ฒ๋ผ ํด๋์ค๋ ์ฌ์ค 'ํน๋ณํ ํจ์'๋ก, ํด๋์ค ์ ํ์ค๋ ํด๋์ค ํํ์๊ณผ ํด๋์ค ์ ์ธ์ ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๋ค.
ํด๋์ค ์ ์ธ์ Class declarations
ํด๋์ค๋ฅผ ์ ์ํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํด๋์ค ์ ์ธ์์ด๋ค. ํด๋์ค๋ฅผ ์ ์ํ๊ธฐ ์ํด์๋ ํด๋์ค์ ์ด๋ฆ๊ณผ ํจ๊ป class
ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์๋์ ์์์์๋ Rectangle
์ด ๋๋ค.
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
ํจ์ ์ ์ธ์(function declarations)๊ณผ ํด๋์ค ์ ์ธ์(class declaration) ์ฌ์ด์ ์ค์ํ ์ฐจ์ด์ ์ ํจ์ ์ ์ธ์์ด ํธ์ด์คํ ๋๊ณ , ํด๋์ค ์ ์ธ์์ ๊ทธ๋ ์ง ๋ชปํ๋ค๋ ์ ์ด๋ค. ์ฐ์ ํด๋์ค๋ฅผ ์ ์ธํ ๋ค ๊ทธ ํ์ ์ ๊ทผํด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ ๊ฐ์ ์ฝ๋๋ฅผ ReferenceError๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
const p = new Rectangle(); // Reference Error
class Rectangle {}
ํด๋์ค ํํ์ Class expression
ํด๋์ค๋ฅผ ์ ์ํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด๋ค. ํด๋์ค ํํ์์ ์ด๋ฆ ๋ถ์ฌ์ง๊ฑฐ๋, ์ต๋ช
์ผ๋ก ๋ง๋ค์ด์ง ์๋ ์๋ค. named ํด๋์ค ํํ์์ ๋ถ์ฌ์ง ์ด๋ฆ์ ํด๋์ค ๋ฐ๋์ ์ง์ญ์ ์ด๋ค. (ํด๋์ค์ name
์์ฑ์ ํตํด ๊ฒ์๋ ์๋ ์๋ค. ์ธ์คํด์ค์ name
์์ฑ์ ์ํด์๋ ๋ถ๊ฐ๋ฅํ๋ค)
// unnamed
let Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
console.log(Rectangle.name); // Rectangle
// named
let Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name); // Rectangle2
ํด๋์ค ํํ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ์ด์คํ ๊ท์น์ ์ ์ฉ๋ฐ๋๋ค. ์ฐ์ ์ ์ธํ ๋ค์ ์ ๊ทผํด์ผ ํ๋ค.
Class body and method definitions
ํด๋์ค ๋ฐ๋๋ {}
๋ก ๊ฐ์ธ์ง ๋ถ๋ถ์ ๋งํ๋ค. ์ด ๋ถ๋ถ์ ๋ฉ์๋์ constructor ๊ฐ์ ํด๋์ค ๋ฉค๋ฒ๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ด๋ค.
strict mode
ํด๋์ค ๋ฐ๋๋ ์๊ฒฉ ๋ชจ๋ ์์์ ์คํ๋๋ค.
Constructor
constructor ๋ฉ์๋๋ class ํค์๋๋ก ์์ฑ๋ ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ด๊ธฐํ๋ฅผ ์ํ ํน๋ณํ ๋ฉ์๋์ด๋ค. ํ๋์ ํด๋์ค ์์๋ constructor๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ํน๋ณํ ๋ฉ์๋๋ ์ค์ง ํ๋๋ง ์ฌ ์ ์๋ค. ํ๋ ์ด์์ constructor ๋ฉ์๋๊ฐ ์จ๋ค๋ฉด SyntaxError๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
Prototype methods
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// getter
get area() {
return this.calcArea();
}
// method
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
Generator methods
class Polygon {
constructor(...sides) {
this.sides = sides;
}
// method
getSides() {
for(const side of this.sides) {
yield side;
}
}
}
const pentagon = new Polygon(1, 2, 3, 4, 5);
console.log([...pentagon.getSides()]); // [1, 2, 3, 4, 5]
Static methods and properties
static
ํค์๋๋ ํด๋์ค์ static method์ static property๋ฅผ ์ ์ํ๋ค. Static ๋ฉค๋ฒ๋ ์ด ํด๋์ค๋ฅผ ์ธ์คํด์คํ(instantiating)ํ์ง ์๊ณ ํธ์ถ๋๋ฉฐ, ํด๋์ค ์ธ์คํด์ค๋ฅผ ํตํด ํธ์ถํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. Static methods๋ ์ข
์ข
์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฐ์ด๋ฉฐ, Static properties๋ ์บ์๋ fixed-configuration, ๋๋ ์ธ์คํด์ค ์ ์ฒด์ ๋ณต์ฌ๋ ํ์๊ฐ ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ํด ์ ์ฉํ๊ฒ ์ฐ์ธ๋ค.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static displayName = 'Point';
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.hypot(dx, dy)
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance; // undefined
p2.displayName; // undefined
p2.distance; // undefined
console.log(Point.displayName); // 'Point'
console.log(Point.distance(p1, p2)); // 7.0710678118654755
ํ๋กํ ํ์
๊ณผ static methods๋ก this
๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ
๊ฐ๋ น ๋ณ์์ ๋ฉ์๋๋ฅผ ํ ๋นํ๊ณ ์ด๋ฅผ ๋ถ๋ฅด๋ ๊ฒ์ฒ๋ผ, static ๋๋ ํ๋กํ ํ์
๋ฉ์๋๋ฅผ this ๋ฅผ ์ํ value ์์ด ํธ์ถํ์ ๋, this
๊ฐ์ ๋ฉ์๋ ๋ด์์ undefined
์ผ ๊ฒ์ด๋ค. 'use strict' ๊ตฌ๋ฌธ์ด ์์ด๋ ๊ฐ์ ๋ฐ์์ด ๋์จ๋ค. class ๋ฐ๋๋ ํญ์ ์๊ฒฉ ๋ชจ๋ ๋ด์์ ์คํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
let obj = new Animal();
obj.speak(); // the Animal object
let speak = obj.speak;
speak(); // undefined
Animal.eat(); // class Animal
let eat = Animal.eat;
eat(); // undefined
Reference
davidtang.io/javascript-constructor-functions-and-classes/
'๐ฉโ๐ป > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[leetCode] Add Binary (0) | 2021.06.27 |
---|---|
[JavaScript] ์ฝ์คํ, ์ฝ๋ฐฑํ, ์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์๋ฆฌ๋ฅผ ํตํ ๋น๋๊ธฐ ํจ์์ ์คํ ๊ณผ์ (0) | 2021.05.09 |
[JavaScript] ์๊ฒฉ ๋ชจ๋ (use strict) (0) | 2021.05.05 |
[JavaScript] call, apply and bind (0) | 2021.05.05 |
[JavaScript] ์ ๊ท์ ์ด์ฉํ String Date ๊ฐ๊ณตํ๊ธฐ (0) | 2021.03.31 |