원래 이렇게 썼습니다.
function Dog(){ this.name = 'hachi'; } Dog.prototype = { makeNoise:function(){ alert('wangwangwang'); } };
나중에 좀 더 복잡하고 불필요해 보이는 또 다른 글쓰기 방법을 보았습니다.
function Dog(){ var privateVariable = 'secret'; var fn = function(){ //... } fn.prototype = { makeNoise:function(){ alert('wangwangwang'); } } return fn; }
여기서 Dog 함수는 실제로 실제 Dog 클래스를 반환하는 클래스 생성 함수입니다.
나는 이 작업의 장점이 더 나은 캡슐화라고 생각합니다.
예를 들어 여기서 privateVariable은 개인 변수입니다.
var d = new Dog; d.privateVariable //undefined
그리고 첫 번째 예문 끝에 문장을 추가하면
Dog.prototype = { //e...WTF?? }
이렇게 하면 개는 더 이상 개가 아니다~
나중에 이해하기:
위의 새 클래스 생성 방법은 프로토타입 객체를 직접 재정의합니다. 이러한 방식으로 프로토타입에 원래 내장된 속성(인수, 호출, 적용 등)이 사라집니다.
새 클래스를 만드는 다음 방법이 더 나은 것 같습니다.
var Dog = function(name){ this.name = name; var privateVariable = 'you cannot see me.'; this.getPrivate = function(){return privateVariable;}; }