JavaScript가 생성자 패턴을 사용하여 객체 인스턴스를 생성하는 방법에 대한 자세한 설명

伊谢尔伦
풀어 주다: 2017-07-27 10:32:15
원래의
3301명이 탐색했습니다.

생성자 패턴

Object 및 Array와 같은 생성자는 런타임 시 실행 환경에 자동으로 나타납니다. 또한 사용자 정의 생성자를 만들어 사용자 정의 개체 유형의 속성과 메서드를 정의할 수 있습니다.


function Person(name, age, job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function(){
 alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
로그인 후 복사

이 예에서는 Person() 함수가 createPerson() 함수를 대체합니다. createPerson()과 동일한 부분 외에도 Person()의 코드에는 다음과 같은 차이점이 있습니다.

1. 개체가 명시적으로 생성되지 않습니다.

2. 이 개체는

3.

Person의 새 인스턴스를 만들려면 new 연산자를 사용해야 합니다. 이런 방식으로 생성자를 호출하는 것은 실제로 다음 4단계를 거칩니다.

(1) 새 개체 만들기
(2) 생성자의 범위를 새 개체에 할당합니다(이는 이 새 개체를 가리킵니다) ;
( 3) 생성자에서 코드를 실행합니다(이 새 개체에 속성을 추가합니다).
(4) 새 개체를 반환합니다.

이전 예의 끝에서 person1과 person2는 각각 다른 Person 인스턴스를 보유합니다. 두 객체 모두 아래와 같이 Person을 가리키는 생성자 속성을 가지고 있습니다.

alert(person1.constructor == Person); //true
alert(person2.constructor == Person); //true
로그인 후 복사

객체의 생성자 속성은 원래 객체 유형을 식별하는 데 사용됩니다. 그러나 객체 유형을 감지하는 경우에는 instanceof 연산자가 더 안정적입니다. 이 예제에서 생성한 모든 객체는 Object 인스턴스이자 Person 인스턴스이며, 이는 instanceof 연산자를 통해 확인할 수 있습니다.

alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true
로그인 후 복사

사용자 정의 생성자를 생성한다는 것은 나중에 해당 인스턴스를 특정 유형으로 식별할 수 있다는 것을 의미하며, 여기서 생성자 패턴이 팩토리 패턴보다 성능이 뛰어납니다. 이 예에서 person1과 person2는 모두 Object의 인스턴스입니다. 모든 개체가 Object에서 상속되기 때문입니다.

생성자 문제

생성자 패턴은 사용하기 쉽지만 단점이 없는 것은 아닙니다. 생성자를 사용할 때의 주요 문제점은 각 인스턴스에서 각 메소드를 다시 작성해야 한다는 것입니다.

ECMAScript의 함수는 객체이므로 함수가 정의될 ​​때마다 객체가 인스턴스화됩니다. 논리적인 관점에서 볼 때 이때의 생성자는 이렇게 정의할 수도 있습니다.

function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function("alert(this.name)"); // 与声明函数在逻辑上是等价的
}
로그인 후 복사

이러한 관점에서 생성자를 살펴보면 각 Person 인스턴스에 다른 Function 인스턴스(name 속성을 표시하기 위해)가 포함되어 있다는 본질을 더 쉽게 이해할 수 있습니다. 확실히 말하면, 이런 방식으로 함수를 생성하면 범위 체인과 식별자 확인이 달라지지만, Function의 새 인스턴스를 생성하는 메커니즘은 여전히 ​​동일합니다. 따라서 다음 코드에서 증명할 수 있듯이 서로 다른 인스턴스에서 동일한 이름을 가진 함수는 동일하지 않습니다.

alert(person1.sayName == person2.sayName); //false
로그인 후 복사

그러나 동일한 작업을 완료하기 위해 실제로 두 개의 Function 인스턴스를 만들 필요는 없습니다. 게다가 이 개체를 사용하면 코드를 실행하기 전에 함수를 특정 개체에 바인딩할 필요가 없습니다. 따라서 다음과 같이 함수 정의를 생성자 외부로 이동하면 이 문제를 해결할 수 있습니다.


rreee

위 내용은 JavaScript가 생성자 패턴을 사용하여 객체 인스턴스를 생성하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿