JavaScript의 생성자도 다른 언어와 다릅니다. 키워드를 통해 호출 된 모든 기능은 생성자로 간주 될 수 있습니다.
생성자 본체 내부에서는 새로 생성 된 물체를 가리 킵니다. 생성자 본문에 리턴 표현식이 표시되지 않으면 기본적으로이를 기본적으로, 즉 새로 만든 객체를 반환합니다.
코드 사본은 다음과 같습니다.
함수 foo () {
this.bla = 1;
}
foo.prototype.test = function () {
Console.log (this.bla);
};
var test = new foo ();
위의 코드는 foo를 생성자로 호출하고 새로 생성 된 객체 (__proto__)의 프로토 타입을 foo.prototype에 가리 킵니다.
생성자에서 반환 된 식을 정의하면 생성자가 전체 표현식을 반환하지만이 반환 표현식은 물체 여야합니다.
코드 사본은 다음과 같습니다.
함수 바 () {
반환 2;
}
새로운 바 (); // 새 개체
기능 test () {
this.value = 2;
반품 {
Foo : 1
};
}
신약 (); // 반환 된 객체
새 새로운 것이 생략되면 함수는 새 객체를 반환 할 수 없습니다.
코드 사본은 다음과 같습니다.
함수 foo () {
this.bla = 1; // 글로벌 객체에 설정됩니다
}
foo (); // 한정되지 않은
위의 예는 일부 시나리오에서도 작동 할 수 있지만 JavaScript 에서이 메커니즘으로 인해 여기에서 글로벌 객체를 지적합니다.
공장 모델
키워드를 새로 사용하려면 생성자가 리턴 값을 표시해야합니다.
코드 사본은 다음과 같습니다.
함수 바 () {
var 값 = 1;
반품 {
방법 : function () {
반환 값;
}
}
}
bar.prototype = {
foo : function () {}
};
새로운 바 ();
술집();
위의 예에서는 새로 사용하지 않고 함수 바를 호출하는 효과가 동일하며 메소드 메소드가 포함 된 새로 생성 된 개체가 반환됩니다. 이는 실제로 폐쇄입니다.
여기서 주목해야 할 것은 New Bar ()가 Bar.Prototype를 반환하지 않지만 대신 반환 표현식 내부의 기능 메소드의 프로토 타입 객체가된다는 것입니다.
위의 예에서는 새로 사용하든 아니든 기능에 차이가 없습니다.
공장 모드를 통해 새 개체를 만듭니다
우리는 종종 새로운 사용을 잊어 버리면 오류가 발생하기 때문에 새로운 것을 사용하지 말아야합니다.
객체를 만들려면 공장 패턴을 사용하고 공장 패턴 내에 새로운 객체를 구성하는 것이 좋습니다.
코드 사본은 다음과 같습니다.
함수 foo () {
var obj = {};
obj.value = 'blub';
var private = 2;
obj.somemethod = function (value) {
this.value = value;
}
obj.getPrivate = function () {
개인 반품;
}
반환 obj;
}
위의 예제 코드는 새로 사용하는 것보다 오류가 발생하지 않으며 개인 변수를 사용할 때 더 편리하지만 몇 가지 단점이 있습니다.
프로토 타입 객체를 공유 할 수 없으므로 더 많은 메모리가 필요합니다.
상속을 달성하기 위해 공장 패턴은 다른 객체의 모든 방법을 복사하거나 새로운 객체의 프로토 타입으로 사용해야합니다.
프로토 타입 체인을 포기하는 것은 새로운 사용을 피하기위한 것입니다. 이는 JavaScript 언어의 정신과 상반되는 것 같습니다.
요약
새로 사용하는 것이 오류가 발생하기 쉬운 일이지만, 이것이 프로토 타입 체인의 사용을 포기하는 이유는 아닙니다. 결국 어떤 방법을 취해야하는지에 대해서는 응용 프로그램의 요구에 따라 다릅니다. 가장 좋은 방법은 스타일을 선택하고 고수하는 것입니다.
간단히 말해서, 생성자는 인스턴스 객체를 초기화하는 것이며 객체의 프로토 타입 속성은 인스턴스 객체를 상속합니다.