1. 공장 모델
기능인 (이름, 나이) {var p = new Object (); p.name = 이름; p.age = 연령; p.showmessage = function () {console.log ( "이름 :"+this.name+"age :"+this.age); } return p;} var p1 = person ( "k1", 28); var p2 = person ( "k2", 29); console.log (p1.showmessage == p2.showmessage); // 거짓은 showmessage method console.log (p1.constructor); [대상]이 아닙니다.공장 패턴의 결함은 객체 인식 문제가 해결되지 않으며 각 객체의 ShowMessage 메소드가 동일하지 않다는 것입니다 (각 메소드가 각 객체 인스턴스에서 재현 됨)가 오버 헤드를 증가시킵니다.
2. 생성자 모드
기능인 (이름, 나이) {this.name = 이름; this.age = age; this.showmessage = function () {console.log ( "이름 :"+this.name+"age :"+this.age); }} var p1 = new Person ( "K1", 28); var p2 = new Person ( "K2", 29); console.log (p1.showmessage == p2.showmessage); // 동일한 showmessage method console.log (p1.constructor); [person] constole.log (p1 person);생성자 패턴은 객체 인식 문제를 해결하지만 각 객체의 ShowMessage 메소드는 동일하지 않으며 (각 메소드는 각 객체 인스턴스에서 재현 됨) 오버 헤드가 증가합니다.
3. 프로토 타입 모드
function person () {} person.prototype.name = "k"; person.prototype.age = 29; person.prototype.showmessage = function () {console.log ( "name :"+this.name+"age :"+this.age);}; var p1 = new person (); new p1.showmessage (); person (); p2.showmessage (); // name : k age : k age : 29console.log (p1.showmessage == p2.showmessage); // true -참조는 동일한 함수 console.log (p1.constructor) // [person] -object enlodition console.log (p1 instancef person) // console.log (person.prototype.isprototypof (p1)); // trueconsole.log (Object.getPrototypo (p1) == person.prototype); // true프로토 타입 패턴은 "각 메소드가 각 객체 인스턴스에서 재현됩니다"의 문제를 해결하고 객체 인식 문제를 해결합니다.
프로토 타입 모드의 큰 문제는 기능 프로토 타입에 장착 된 모든 객체, 변수 및 함수가 함수의 모든 인스턴스에서 공유된다는 것입니다. 인스턴스 P1 및 P2를 통해 프로토 타입의 특성에 액세스 할 수 있지만 속성 값을 수정할 수 없습니다. 예를 들어, p1.name = "k1"은 p1 인스턴스에 name = "k1"의 속성 만 추가하며 프로토 타입으로 변경되지 않습니다. 가치 유형이라면 괜찮지 만 참조 유형이라면 문제가 있습니다. 다음 예를 참조하십시오
function person () {}; person.prototype.age = 10; person.prototype.array = [1,2,3]; var p1 = new person (); var p2 = new person (); console.log (p1.array); // [1,2,3] console.log (p2.array); // 1,2,3] p1.array.push(4);console.log(p1.array) ;// 1,2,3,4] console.log(p2.array) ;//4]P1은 배열에 값을 추가하며, 모두 동일한 배열을 가리키기 때문에 P2에도 반영됩니다.
4. 생성자 모드와 프로토 타입 모드 결합
이것은 생성자와 프로토 타입 패턴의 장점을 결합하여 객체를 만드는 가장 일반적인 방법입니다.
기능인 (이름, 나이) {this.name = 이름; this.age = age;} person.prototype.showmessage = function () {console.log ( "name :"+this.name+"age :"+this.age); var p1 = new person ( "k", 30); showmessage ();5. 동적 프로토 타입 모드
주요 솔루션은 다음과 같습니다. 생성자의 모든 정보를 캡슐화합니다.
기능인 (이름, 나이) {this.name = 이름; this.age = age; if (this.showMessage! = "function") {person.prototype.showMessage = function () {console.log ( "이름 :"+this.name+"age :"+this.age); }}} var p1 = 새로운 사람 ( "k", 30); p1.showmessage ();6. 기생 생성자 패턴
기능인 (이름, 나이) {var o = new Object (); o.name = 이름; O.age = 연령; o.sayname = function () {console.log (this.name); }; return o;} var p1 = 새로운 사람 ( "k", 28); p1.sayname ();기생 작물 패턴은 객체를 만들 때 새로운 키워드가 사용된다는 점을 제외하고는 공장 패턴과 정확히 동일합니다. 위의 예 : var p1 = 새로운 사람 ( "k", 28).
주요 기능은 다음과 같습니다.이 생성자의 함수를 확장하는 것입니다. 예를 들어, 배열 배열을 기반으로하는 배열 유형 MyArray를 정의하고 다음과 같이 자체 메소드가 있습니다.
function myArray () {var value = new array (); values.push.apply (값, 인수); // 직접 정의 된 메소드 값 .topipedString = function () {return this.join ( '|'); }; 반환 값;} var colors = new MyArray ( "빨간색", "파란색", "녹색"); console.log (colors.topipedString ()); console.log (색상 인스턴스 어레이);7. 안정적인 생성자 모드
안전한 생성자는 기생 생성자 유형의 패턴을 따르지만 두 가지 차이점이 있습니다. 하나는 이것을 사용하지 않고 다른 하나는 생성자를 호출하기 위해 새로운 것을 사용하지 않아야합니다.
기능인 (이름, 나이) {var o = new Object (); var tempage = age; o.name = 이름; O.age = 연령; o.sayname = function () {console.log (이름); } O.sayage = function () {console.log (템페지); } return o;} var p1 = person ( "k1", 28); p1.sayname (); // k1p1.sayage (); // 28p1.name = "k2"; p1.age = 30; p1.sayname (); // k1p1.sayage (); // 28위의 출력을 볼 때 안전한 객체 패턴이 무엇인지 이해할 수 있습니다. 이 모드를 사용하여 생성 된 객체입니다. 초기화 중에 전달 된 값을 변경하는 다른 방법은 없습니다. 이것은 사람입니다 ( "K1", 28). 그러한 대상은 안전한 대상입니다. 실제로, 그것은 JavaScript의 폐쇄입니다.
JavaScript 객체를 만드는 방법에 대한 위의 간단한 분석은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.