var cont = document.getElementById('rs') var ln = `\n` var line = `\n${'#'.repeat(64)}\n` function Person(name){ if(this instanceof Person){ this.name = name }else{ cont.textContent += ln + `Error Pserson(name): ${name}` throw new Error("You must use new with Person.") } } function User(name){ // ECMA6 this.target을 활용 if(typeof new.target === 'undefined' || new.target !== User){ cont.textContent += ln + `Error User(name): ${name}` throw new Error("You must use new with User") } this.name = name } cont.textContent += line try{ var person = new Person("person") // 정상실행 var notAPerson = Person.call(person, "notAPerson") // 정상실행?, call 함수로 실행하면 new로 실행했는지 확인 방법이 없다. var notAPerson2 = Person("notAPerson2") // Error }catch(e){ cont.textContent += ln + `Catch: ${e}` } cont.textContent += line try{ var user = new User('user') var notAUser = User.call(user, "notAUser") var notAUser2 = User("notAUser2") }catch(e){ cont.textContent += ln + `Catch: ${e}` }
<p> 자바스크립트 함수네는 [[Call]], [[Construct]]라는 두가지 다른 내부 전용 메서드가 있다.<br/> 함수를 new가 없이 호출하면 [[Call]]이 실행되고, new로 호출하면 [[Construct]] 메서드가 호출된다. </p> <p> [[Construt]] 메서드는 인스턴스라 부르는 새 객체를 만들어서 this에 그 인스턴스를 할당하고 함수를 실행하는 역활을 한다. </p> <p> [[Construct]] 메서드를 가진 함수는 <b>생성자</b>로 불린다.<br/> 모든 함수가 [[Construct]]를 갖지 않으므로, 모든 함수가 new로 호출될 수 없다는 것을 명심하자. </p> <pre id="rs"></pre>