@@ -6,40 +6,40 @@ JavaScript의 생성자는 다른 언어들과 다르게 `new` 키워드로 호
66
77그리고 생성자에 명시적인 ` return ` 구문이 없으면 this가 가리키는 객체를 반환한다.
88
9- function Foo( ) {
10- this.bla = 1 ;
9+ function Person(name ) {
10+ this.name = name ;
1111 }
1212
13- Foo .prototype.test = function() {
14- console.log(this.bla );
13+ Person .prototype.logName = function() {
14+ console.log(this.name );
1515 };
1616
17- var test = new Foo ();
17+ var sean = new Person ();
1818
19- 위 코드는 ` new ` 키워드가 실행되는 시점에 ` Foo ` 를 생성자로 호출하고 ` Foo .prototype` 을 새 객체의 prototype에 할당한다 .
19+ 위 코드는 ` Person ` 을 생성자로 호출하고 새로 생성된 객체의 ` prototype ` 을 ` Person .prototype` 으로 설정한다 .
2020
2121아래 코드와 같이 생성자에 명시적인 ` return ` 문이 있는 경우에는 반환하는 값이 객체인 경우에만 그 값을 반환한다.
2222
23- function Bar () {
24- return 2 ;
23+ function Car () {
24+ return 'ford' ;
2525 }
26- new Bar (); // 새 객체를 만들어 반환
26+ new Car (); // 'ford'가 아닌 새로운 객체를 반환
2727
28- function Test () {
29- this.value = 2;
28+ function Person () {
29+ this.someValue = 2;
3030
3131 return {
32- foo: 1
32+ name: 'Charles'
3333 };
3434 }
35- new Test (); // 명시한 객체를 반환
35+ new Person (); // someValue가 포함되지 않은 ({name:'Charles'}) 객체 반환
3636
3737new 키워드가 없으면 그 함수는 객체를 반환하지 않는다.
3838
39- function Foo () {
40- this.bla = 1 ; // 전역객체에 할당된다.
39+ function Pirate () {
40+ this.hasEyePatch = true ; // 전역 객체를 준비!
4141 }
42- Foo (); // undefined
42+ var somePirate = Pirate (); // somePirate = undefined
4343
4444위 예제는 그때그때 다르게 동작한다. 그리고 [ ` this ` ] ( #function.this ) 객체의 동작 원리에 따라서 Foo 함수안의 ` this ` 의 값은 * Global 객체* 를 가리키게된다.
4545(역주: 결국 new 키워드를 빼고, 코드를 작성할 경우 원치 않은 this 참조 오류가 발생할 수 있다.)
@@ -48,24 +48,24 @@ new 키워드가 없으면 그 함수는 객체를 반환하지 않는다.
4848
4949생성자가 객체를 반환하면 ` new ` 키워드를 생략할 수 있다.
5050
51- function Bar () {
52- var value = 1 ;
51+ function Robot () {
52+ var color = 'gray' ;
5353 return {
54- method : function() {
55- return value ;
54+ getColor : function() {
55+ return color ;
5656 }
5757 }
5858 }
59- Bar .prototype = {
60- foo : function() {}
59+ Robot .prototype = {
60+ someFunction : function() {}
6161 };
6262
63- new Bar ();
64- Bar ();
63+ new Robot ();
64+ Robot ();
6565
66- new 키워드의 유무과 관계없이 ` Bar ` 생성자의 동작은 동일한다 . 즉 [ 클로저] ( #function.closures ) 가 할당된 method 프로퍼티가 있는 새로운 객체를 만들어 반환한다.
66+ new 키워드의 유무과 관계없이 ` Robot ` 생성자의 동작은 동일하다 . 즉 [ 클로저] ( #function.closures ) 가 할당된 method 프로퍼티가 있는 새로운 객체를 만들어 반환한다.
6767
68- ` new Bar () ` 로 호출되는 생성자는 반환되는 객체의 prototype 프로퍼티에 아무런 영향을 주지 않는다. 객체를 반환하지 않는 생성자로 만들어지는 경우에만 객체의 prototype이 생성자의 것으로 할당된다.
68+ ` new Robot () ` 으로 호출되는 생성자는 반환되는 객체의 prototype 프로퍼티에 아무런 영향을 주지 않는다. 객체를 반환하지 않는 생성자로 만들어지는 경우에만 객체의 prototype이 생성자의 것으로 할당된다.
6969
7070그러니까 이 예제에서 ` new ` 키워드의 유무는 아무런 차이가 없다.
7171(역주: 생성자에 객체를 만들어 명시적으로 반환하면 new 키워드에 관계없이 잘 동작하는 생성자를 만들수있다. 즉, new 키워드가 빠졌을때 발생하는 this 참조 오류를 방어해준다.)
@@ -76,19 +76,21 @@ new 키워드의 유무과 관계없이 `Bar` 생성자의 동작은 동일한
7676
7777객체를 만들고 반환해주는 팩토리를 사용하여 ` new ` 키워드 문제를 회피할 수 있다.
7878
79- function Foo () {
80- var obj = {};
81- obj.value = 'blub ';
79+ function CarFactory () {
80+ var car = {};
81+ car.owner = 'nobody ';
8282
83- var private = 2;
84- obj.someMethod = function(value) {
85- this.value = value;
83+ var milesPerGallon = 2;
84+
85+ car.setOwner = function(newOwner) {
86+ this.owner = newOwner;
8687 }
8788
88- obj.getPrivate = function() {
89- return private ;
89+ car.getMPG = function() {
90+ return milesPerGallon ;
9091 }
91- return obj;
92+
93+ return car;
9294 }
9395
9496` new ` 키워드가 없어도 잘 동작하고 [ private 변수] ( #function.closures ) 를 사용하기도 쉽다. 그렇지만, 단점도 있다.
0 commit comments