Edit in JSFiddle

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>