// 이런 방식은 객체에 새 속성을 추가할 수 있는데
// 원형에 추가는 할 수가 없다.
function Car(m, c, s) {
this.model = m;
this.color = c;
this.speed = s;
}
이런 코드가 존재 할 때 우리는 생성자를 이용하여 객체에 직접 값을 주입할 수 있다.
let temp = new Car("봉고", "검정", 100);
// 객체에 추가 stop메서드를
temp.stop = function () {
this.speed = 0;
return this.speed;
};
이 때 객체에 직접 할당하는 방식이라 만약 새로운 객체를 만든다면 stop이라는 함수는 사용할 수 없다.
그러나 prototype을 이용하여 생성자 함수에 직접 주입 할 수 있다.
let temp = new Car("봉고", "검정", 100);
let temp2 = new Car("다마스", "검정", 100);
Car.prototype.stop = function () {
this.speed = 0;
return this.speed;
};
console.log(temp.stop()); //0
// temp2는 없으니까
console.log(temp2.stop()); //0
우리가 기존에 사용하는 문자열은 String생성자 함수의 객체이다. 즉 추가가 가능하다.
String.prototype.replaceOf = function () {
console.log("나는 프로토 타입으로 추가 됐어");
};
// 문자열의 원형은 String이고
console.log("가,나".replace("가", "나")); //나,나
function fun() {
for (var i = 0; i < 5; i++) {
debugger;
setTimeout(() => {
console.log(i); //다 5가 나옴
}, i * 1000);
}
function fun3(params) {
let value = "";
// 내부 함수에서 외부함수의 변수를 사용
function fun4() {
if (value == "") {
value = "클로저";
return value;
}
}
return fun4;
}
let closure = fun3();
let a = closure();
console.log(a); //클로저
// 작성법
// 즉시 실행 함수
// 전역에 ()안에 익명함수처럼 생긴 구문.
// 맨 뒤에 ()함수 실행식
// 실행식 괄호에 매개변수를 전달하면 된다.
(function () {
console.log("즉시 실행 함수");
let a = 5;
})();
let a = 4;
function temp(b) {
(function (c) {
console.log("즉시 실행 함수");
let a = 5;
console.log(c);
})(b);
}
temp("안뇽");
이터러블과 이터레이터 ES6에 추가되었고 이터러블은 반복이 가능한 객체라는 뜻
이터러블을 반복하는 반복문
forEach:배열을 순회하면서 아이템을 반복 실행한다. 아이템의 갯수만큼
for of: 이터러블의 아이템을 반복 실행한다.
반복자 Symbol.iterator: 이터러블 객체를 나타내는 메서드 이름으로 사용. 해당 객체가 이터러블 이라는 것, Symbol.iterator 메소드가 이터레이터 객체를 반환한다.
이터레이터 객체의 next메소드가 있어요.
next메소드를 사용하면 {value,done}객체를 반환한다.
반복중인 아이템을 value에 done은 끝났는지를 알려준다.
이터레이터는 이터러블(반복 가능한 객체)를 순차적으로 접근할 수 있는 기능
const Arr = [1, 2, 3, 4, 5];
const objIter = {
index: 0,
next: function () {
if (this.index < Arr.length) {
// done마지막 요소가 맞니?
return { value: Arr[this.index++], done: false };
} else {
// done마지막 요소 끝
return { done: true };
}
},
};
// console.log(objIter.next().value);
// console.log(objIter.next().value);
// console.log(objIter.next().value);
// console.log(objIter.next().value);
// console.log(objIter.next().value);
// console.log(objIter.next().done);
const Arr2 = [1, 2, 3, 4, 5];
// Symbol은 객체의 속성에 접근하는데 사용한다 했음.
// 객체에 속성으로 접근하는데 Symbol.iterator
// Arr2[Symbol.iterator]() 이터레이터 객체를 반환해준다.
const iter2 = Arr2[Symbol.iterator]();
let result2 = iter2.next();
console.log(result2); //{value: 1, done: false}
result2 = iter2.next();
console.log(result2);//{value: 2, done: false}
result2 = iter2.next();
console.log(result2);//{value: 3, done: false}
result2 = iter2.next();
console.log(result2);//{value: 4, done: false}
result2 = iter2.next();
console.log(result2);//{value: 5, done: false}
result2 = iter2.next();
console.log(result2);//{value: undefined, done: true}
뛰어난 글이네요, 감사합니다.