>웹 프론트엔드 >JS 튜토리얼 >JavaScript가 프로토타입 패턴을 사용하여 객체 인스턴스를 생성하는 방법에 대한 자세한 설명

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

ringa_lee
ringa_lee원래의
2017-10-15 09:34:431581검색

프로토타입 모드


function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
 alert(this.name);
};
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true

예제에서는 속성과 메서드를 추가할 때마다 Person.prototype을 입력해야 합니다. 불필요한 입력을 줄이고 프로토타입의 기능을 시각적으로 더 잘 캡슐화하기 위해 다음 예제와 같이 모든 속성과 메서드를 포함하는 개체 리터럴로 전체 프로토타입 개체를 재정의하는 것이 더 일반적입니다.


function Person(){
}
Person.prototype = {
 name : "Nicholas",
 age : 29,
 job: "Software Engineer",
 sayName : function () {
 alert(this.name);
 }
};

위 코드에서는 Person.prototype을 객체 리터럴로 생성된 새 객체와 동일하게 설정했습니다. 최종 결과는 동일하지만 한 가지 예외는 생성자 속성이 더 이상 Person을 가리키지 않는다는 것입니다. 앞서 소개했듯이 함수가 생성될 때마다 해당 프로토타입 객체가 동시에 생성되며 이 객체도 자동으로 생성자 속성을 얻습니다. 여기서 사용하는 구문은 기본적으로 기본 프로토타입 객체를 완전히 다시 작성하므로 생성자 속성은 새 객체의 생성자 속성(Object 생성자를 가리킴)이 되고 더 이상 Person 함수를 가리키지 않습니다. 이때, instanceof 연산자는 여전히 올바른 결과를 반환할 수 있지만, 아래와 같이 생성자를 통해 객체의 유형을 결정할 수는 없습니다.


var friend = new Person();
alert(friend instanceof Object); //true
alert(friend instanceof Person); //true
alert(friend.constructor == Person); //false
alert(friend.constructor == Object); //true

여기서 object 및 Person을 테스트하기 위해 objectofree 연산자를 사용하면 여전히 true를 반환하지만 생성자 속성은 Object와 같고 Person과는 같지 않습니다. 생성자의 값이 정말 중요한 경우 아래와 같이 의도적으로 적절한 값으로 다시 설정할 수 있습니다.


function Person(){
}
 Person.prototype = {
 constructor : Person,
 name : "Nicholas",
 age : 29,
 job: "Software Engineer",
 sayName : function () {
 alert(this.name);
 }
};

한 가지 주의할 점은 인스턴스의 포인터가 생성자가 아닌 프로토타입만 가리킨다는 것입니다.

프로토타입 객체의 문제: 프로토타입 패턴에 단점이 없는 것은 아닙니다. 첫째, 초기화 매개변수를 생성자에 전달할 필요성을 생략하므로 모든 인스턴스는 기본적으로 동일한 속성 값을 얻습니다. 이는 어느 정도 불편을 끼칠 수 있지만 프로토타입의 가장 큰 문제는 아니다. 프로토타입 패턴의 가장 큰 문제는 공유 특성에서 발생합니다.


rreee

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.