ë댟ě˝ëŠ 'íëĄ í¸ěë íě ë¸ëźě°ě 101' ę°ě
ěíě˝ëŠ 2014 this, ěě ę°ě
ëšęˇźë§ í´ëŚ 꾏í ę˛ě
'use strict';
const bgSound = new Audio('sound/bg.mp3');
const alertSound = new Audio('sound/alert.wav');
const carrotSound = new Audio('sound/carrot_pull.mp3');
const bugSound = new Audio('sound/bug_pull.mp3');
const winSound = new Audio('sound/game_win.mp3');
// ěŹěŠěę° ë§¤ë˛ ě¤ëě¤ íěźě í ëší ëłě ě´ëŚě 기ěľí íě ěëëĄ í¨ě뼟 ë§ëŚ
// ě´ë ę˛ ě í늴 sound.playSound(carrotSound)ě˛ëź ěźěźě´ ě¤ëě¤ëĽź ě ě´ě¤ěź í¨
export function playBackground () {
playSound(bgSound);
}
export function playAlert () {
playSound(alertSound);
}
export function playCarrot () {
playSound(carrotSound);
}
export function playBug () {
playSound(bugSound);
}
export function playWin () {
playSound(winSound);
}
export function stopBackground () {
stopSound(bgSound);
}
// main.jsěě ę°ě ¸ě¨ í¨ěë¤
// ęłľíľě ěźëĄ ě°ěŹěź íë í¨ěě´ëŻëĄ ę¸ëĄë˛ ě¤ě˝íě ě ě¸
function playSound (sound) {
sound.currentTime = 0;
sound.play();
}
function stopSound (sound) {
sound.pause();
}
ěëě ę°ě´ ěěąíë¤.
import * as sound from './sound.js';
sound.playCarrot();
func();
window.func(); // func()ě ę°ë¤. window ěëľ ę°ëĽ.
window.o.func(); // ě ě ę°ě˛´ windowë oëźë ę°ě˛´ëĽź íëĄíźí°ëĄ ę°ě§ë¤.
ěíě˝ëŠ 2014 this ę°ě ě°¸ęł
í¨ě ë´ěě í¨ě í¸ěś 맼ë˝
(context)뼟 ě미íë¤. í¨ě뼟 ě´ëťę˛ í¸ěśíëëě ë°ëźě thisę° ę°ëŚŹí¤ë ëěě´ ëŹëźě§ë¤. ěë°ě¤íŹëŚ˝í¸ěě thisë í¨ěě ę°ě˛´ëĽź ě°ę˛°ěěźěŁźë ěí ě íë¤.
function func () {
if (window === this) {
console.log('window === this');
}
func(); // window === this
ę°ě˛´ě ěěąě´ í¨ěěź ë, ě´ëĽź ëŠěëëźęł íë¤.
ëŠěë í¸ěś ě, ꡸ ëŠěëë ę°ě˛´ ěěě´ę¸° ë돸ě, ëŠěëě thisë ꡸ ę°ě˛´ëĽź ę°ëŚŹí¨ë¤.
var o = {
func = function () {
if (o === this) {
console.log('o === this');
}
}
};
o.func(); // o === this
ěŹě¤ (1)ęłź (2)ë ę°ě 결곟ě´ë¤. (1)ěě func()ë window.func()ě ę°ę¸° ë돸ě´ë¤. (1)ęłź (2)ěě 모ë this
ë ꡸ę˛ě´ ěěąë í¨ěę° ěí ę°ě˛´
뼟 ě미íë¤.
í¨ěę° new í¤ěëě í¨ęť ěěąěëĄ ě°ě´ëŠ´, thisë ë§ë¤ě´ě§ ę°ě˛´ëĽź ę°ëŚŹí¨ë¤.
꡸ë°ë° ë§ě˝ ěëě˛ëź ě˝ë뼟 ěěąí늴 돸ě ę° ë°ěíë¤. ěěąě í¨ě Func()ě if(o2 === this)ę° ě°ěŹ ěë¤.
꡸ëŹë 맨 ë§ě§ë§ ě¤ěě ěěąě í¨ě뼟 í¸ěśí늴 ě´ëĄ ě¸í´ ěěąë ę°ě˛´ë ě´ í¸ěśě´ 모ë ëë íěěź
o2ëźë ëłěě í ëšëë¤. ꡸ ě ęšě§ë ę°ě˛´ë ë§ë¤ě´ě ¸ ěě§ë§, o2ëźë ëłěěë í ëšě´ ëě´ ěě§ ě기 ë돸ě ě°ëŚŹë o2 ëłě뼟 íľí´ ꡸ ę°ě˛´ëĽź 참쥰í ě ěë¤. ꡸ëŹëŻëĄ ěěąě ěěě o2ě thisę° ę°ěě§ëĽź íě¸í늴 ěě§ o2ë undefined ěíě´ëŻëĄ ě´ ěĄ°ęą´ěě falseę° ëë¤.
ë°ëŠ´, this
ë ěěąě í¨ěěěë ꡸ ěěąě í¨ěëĄ ě¸í´ ë§ë¤ě´ě§ ę°ě˛´
뼟 ę°ëŚŹí¤ę˛ ëë¤. ë°ëźě thisë ę°ě˛´ě ěěąě´ ëëě o2ëźë ěëłěě ë´ę¸°ę¸° ě ě ꡸ ę°ě˛´ëĽź ě°¸ęł í ě ěë ěëłěëźęł í ě ěë¤.
var funcThis = null;
function Func() {
if (o2 === this) {
funcThis = this;
};
}
var o2 = new Func();
// 1. ę°ě˛´ 댏í°ë´
// oëźë ę°ě˛´ëĽź ë§ëŚ
var o = {
one : 'one',
two : 'two'
};
// 2. new ě°ě°ěě ěěąě í¨ě
// oëźë ę°ě˛´ëĽź ë§ëŚ
var o = new Object();
o.one = 'one';
o.two = 'two';
// 1. í¨ě 댏í°ë´
// sumě´ëźë í¨ě ěŚ, ę°ě˛´ëĽź ë§ëŚ
function sum (x, y) {
return x + y;
}
// 2. new ě°ě°ěě ěěąě í¨ě
// sumě´ëźë í¨ě ěŚ, ę°ě˛´ëĽź ë§ëŚ
var sum = new Function('x', 'y', 'return x + y');
ë°ëźě í¨ě ëí ę°ě˛´ě´ëŻëĄ ꡸ íëĄíźí°ëĄě ëŠěë뼟 ę°ě§ ě ěë¤. apply
ë í¨ěě ěŹěŠí ě ěë ëŠěë ě¤ íëě´ë¤. ě´ë¤ě ë¤ëĽ¸ ę°ě˛´ ëě ëŠěë뼟 í¸ěś
íë ë° ěŹěŠëë¤.
ěźë°ě ě¸ ę°ě˛´ ě§íĽ ě¸ě´ěě ëŠěëë íëě ę°ě˛´ě ęł ě ëě´ ěěëë¤. ꡸ëŹë ěë°ě¤íŹëŚ˝í¸ěě í¨ěë ꡸ ěě˛´ëĄ ę°ě˛´ě´ę¸°ë íě§ë§, í¨ě뼟 ě´ë¤ 맼ë˝ěě í¸ěśíë
ě ë°ëź ꡸ í¨ěę° ěěë ę°ě˛´ę° ëŹëźě§ ěë ěë¤. (죟ě¸-ë
¸ě ę´ęł)
var o = {};
var p = {};
function func () {
switch (this) {
case o:
console.log('o');
break;
case p:
console.log('p');
break;
case window:
console.log('window');
break;
}
}
func(); // ę°ě í¨ě뼟 ě´ë ę˛ í¸ěśí늴, thisë windowě´ë¤
func.apply(p); // ă thisë window ëě pę° ëë¤
func.apply(o); // ă thisë window ëě oę° ëë¤
ěíě˝ëŠ 2014 ěě ę°ě, [TIL] 210918 íëĄí íě ě˛´ě¸ ě¤ëŞ ě°¸ęł
// [ Person ěěąě í¨ě ]
function Person (name) {
this.name = name;
}
// Personě´ëźë ěěąě í¨ě ěŚ, 'ę°ě˛´'ěë
// prototypeě´ëźë íëĄíźí°ę° ěëë° ěŹę¸°ěë ě´ë¤ 'ę°ě˛´'ę° ë¤ě´ ěë¤
// ꡸ ę°ě˛´ě nameęłź introduce뼟 ě¤ě í´ ę°ě 죟ěë¤
Person.prototype.name = null;
Person.prototype.introduce = function () {
return 'my name is' + this.name;
}
var person = new Person('syong');
console.log(person.introduce()); // my name is syong
// [ Programmer ěěąě í¨ě ]
function Programmer (name) {
this.name = name;
}
Programmer.prototype = new Person();
var p1 = new Programmer('syong');
console.log(p1.introduce()); // my name is syong
Programmer ěěąě ěěë introduce() ëŠěëę° ě ěëě´ ěě§ ěë¤. ꡸ë°ë° Programmer ěěąě뼟 íľí´ ë§ë pl ę°ě˛´ěě introduce() ëŠěë뼟 ěŹěŠí ě ěë ě´ě ë, Programmer ěěąě í¨ěę° Person ěěąě í¨ě뼟 íľí´ ë§ë¤ě´ě§ ę°ě˛´ëĽź ěěí기 ë돸ě´ë¤.
Programmer ěěąě í¨ěę° ę°ě§ęł ěë íëĄíźí° ě¤ě, prototypeě´ëźë íšěí íëĄíźí°ě ę°ěźëĄ, new Person()ě ě§ě í´ ěŁźěë¤. ěŚ, Person ěěąě í¨ě뼟 íľí´ ë§ë ę°ě˛´ëĽź ě§ě í´ě¤ ę˛ě´ë¤.
Person ěěąě í¨ě뼟 íľí´ ę°ě˛´ëĽź ěěąí ë, ěë°ě¤íŹëŚ˝í¸ë Person ěěąě í¨ěę° ę°ě§ęł ěë prototypeě´ëźë íšěí íëĄíźí° ěě ë¤ě´ ěë ę°ě˛´ě ëę°ě ę°ě˛´ëĽź ë§ë ë¤. ꡸ ę°ě˛´ë name ěěąęłź introduce() ëŠěë뼟 ę°ě§ë¤. (name ěěąě Person ěěąě í¨ěě ěí´ ę°ě ę°ě§ę˛ ëë¤.)
đĄ 결ëĄ
Programmer.prototype = new Person();
ě´ë í ę°ě˛´ëĽź ěěë°ęł ěśë¤ëŠ´, ꡸ ę°ě˛´ëĽź ë¤ëĽ¸ ěěąě í¨ěě prototypeě í ëší늴 ëë¤.
// [ Person ěěąě í¨ě ]
function Person (name) {
this.name = name;
}
Person.prototype.name = null;
Person.prototype.introduce = function () {
return 'my name is' + this.name;
}
// [ Programmer ěěąě í¨ě ]
function Programmer (name) {
this.name = name;
}
Programmer.prototype = new Person();
Programmer.prototype.coding = function () {
return 'hello';
}
// [ Designer ěěąě í¨ě ]
function Designer (name) {
this.name = name;
}
Designer.prototype = new Person();
Designer.prototype.design = function () {
return 'beautiful';
}
var p1 = new Programmer('syong');
console.log(p1.introduce()); // my name is syong
console.log(p1.coding()); // hello
var p2 = new Designer('mong');
console.log(p2.introduce()); // my name is mong
console.log(p2.design()); // beatiful