Prototype vs 그냥 함수

var arr ["a", "b", "c"];
//Object.keys()
console.log(Object.keys(arr));

//Object.prototype.toString()
var o = new Object();
console.log(o.toString())

프로토타입을 안쓰는 함수는 그냥 오브젝트의 함수를 사용하는 것. object.(인자)의 형태로 사용해서 객체를 만들어 쓰는게 아니라 그냥 그함수 쓰는 느낌임 ex) 흔히 만드는 sum, change(a,b)이런 것 처럼

반면 프로토타입이 들어가있는 함수는 해당 함수(Object)의 객체를 만들었을 때 그 객체가 사용할 수 있는 함수를 만드는 것임. toString이라는 함수는 JS의 기본내장객체 Object에 .prototype으로 저장되어있는 메소드이다. 그래서 o는 Object의 객체로써 Object가 갖고있는 toString이라는 함수를 쓸 수 있는 것이다.

Prototype사용하는 객체 만들어보기

목표: var o = {’name” : ‘egoing’, ‘city’ : ‘seoul’} 일때, console.log(o.contain(’egoing’)); 이라하면 true가 뜨게 하는 함수 contain을 만들고 싶다.

var o 라고 선언했을 때, o는 일종의 ‘객체’로써 선언 되었음을 알 수 있다. 함수, 배열 등 여러 객체가 있지만, var o에서 o는 JS의 가장 기본적인(상위의) 객체인 “Object’객체이다(배열, 함수위에 Object객체가 기본으로 있다고 생각). 따라서 Object 객체인 o가 contain이라는 함수를 사용할 수 있도록 정의하기 위해선 Object.prototype.contain을 정의하여 모든 Object객체가 contain이라는 함수를 사용할 수 있도록 해줘야겠다.

Object.prototype.contain = function(needle){
	for(var name in this){
		if(this[name] === needle){
			return true;
			}
	}
}

이때 this는 contain이란 메소드가 소속되어있는 ‘객체’를 가리킨다. 여기선 o.contain(’egoing’)을 사용할 경우 this는 o가 되는것이다. o객체에 있는 key값들이 name이 될테니까 this[name]은 value값들이 등장할 것이다. 따라서 넣어준 인자(needle)가 실제 있는지 value값들이랑 비교하면서 있는지 체크해준다.

이렇게 Object에서 contain을 정의해두면 o나 a는 부모인 Object로 부터 상속받아서 contain함수를 쓸수 있게 된다. 만약 부모로부터 상속받은 속성(property)인지 원래 내가 갖고있던 속성인지 구분하려면 hasOwnProperty(parameter)를 쓰면 된다.

원시 데이터 vs 객체 데이터

a = 1;
b= a;
b= 2;
// a값은 변하지 않음

var a = {'id':1];
var b = a;
b.id = 2
// a값은 2로 변함

var a = {'id':1];
var b = a;
b = {'id':2};
// a값은 그대로 1

위의 a와 b는 int형, 원시 데이터로써, a는 1을 가리키고 b는 a의 1을 복제하여 새로운 1을 가리키게 하고있다.

하지만 밑의 a는 객체로 선언되었고, b=a를 하게 되면 b가 a객체를 참조하는 것이다. 그래서 b의 id값을 바꾸면 a의 id가 바뀌게 되는 것이다.

마지막은 b가 새로운 객체를 만든것이다. 그렇기에 b는 더이상 a를 참조하고 있지 않게됨.