js 중의 몇 가지 상용 디자인 모델을 상세히 설명하다.
                                            
 6531 단어  JavaScript설계모드
                    
function createPerson(name, age){
  var o = new Object();  //  
  o.name = name;
  o.age = age;
  o.sayName = function(){
   console.log(this.name)
  }
  return o;  //  
}
var person1 = createPerson('ccc', 18)
var person2 = createPerson('www', 18)공장 모델은 여러 개의 비슷한 대상을 만드는 문제를 해결했지만 대상 식별 문제(즉 하나의 대상의 유형을 어떻게 아는지)를 해결하지 못했다.아래와 같다
person1 instanceof createPerson  // --> false
person1 instanceof Object  // --> true
function Person(name , age){
 this.name = name;
 this.age = age;
 this.sayName = function(){
 console.log(this.name)
 }
}
var person1 = new Person('ccc', 18)
var person2 = new Person('www', 18)
person1.sayName()  // --> 'ccc'
console.log(person1 instanceof Person)  // --> true
console.log(person1 instanceof Object)  // --> true
console.log(person2 instanceof Person)  // --> true
console.log(person2 instanceof Object)  // --> true구조 함수를 사용하는 중요한 문제는 모든 방법이 모든 실례에서 다시 한 번 만들어야 한다는 것이다.person1과person2에는 모두sayName () 이라는 방법이 있지만, 그 두 방법은 같은 Function 실례가 아닙니다.ECMAscript에서 함수가 객체이므로 각 정의마다 하나의 함수, 즉 하나의 객체가 실례화됩니다.논리적으로 말하자면, 이때의 구조 함수도 다음과 같이 정의할 수 있다.
function Person(name , age){
 this.name = name;
 this.age = age;
 this.sayName = new Function('console.log(this.name)')  // eslint: The Function constructor is eval. (no-new-func)
}
function Person(name , age){
 this.name = name;
 this.age = age;
 this.sayName = sayName
}
function sayName(){
 console.log(this.name)
}
var person1 = new Person('ccc', 18)
var person2 = new Person('www', 18)새로운 문제점:
만약 대상이 많은 방법을 정의해야 한다면, 많은 전역 함수를 정의해야 하기 때문에, 우리의 사용자 정의 인용 유형은 조금도 봉인성이 없다.
원형 모드
원형에 관하여 원형 체인의 내용은 여기에 기술하지 않고 원형 디자인 모델만 토론한다
우리가 만든 모든 함수는prototype(원형) 속성이 있습니다. 이 속성은 하나의 지침으로 하나의 대상을 가리키며, 이 대상의 용도는 특정한 유형의 모든 실례가 공유할 수 있는 속성과 방법을 포함하는 것입니다.즉, 구조 함수에서 대상의 실례적인 정보를 정의할 필요가 없고, 이러한 정보를 원형 대상에 직접 추가할 필요가 있다.
function Person(){
}
Person.prototype.name = 'ccc'
Person.prototype.age = 18
Person.prototype.sayName = function(){
 console.log(this.name)
}
var person1 = new Person()
person1.sayName()  // --> ccc
var person2 = new Person()
person2.sayName()  // --> ccc
console.log(person1.sayName === person2.sayName)  // --> true이것은 구조 함수에 매개 변수를 전달하기 위해 매개 변수를 초기화하는 부분을 생략하였으며, 결과적으로 모든 실례는 기본적으로 같은 속성 값을 얻을 것이다.또 원형 모델의 가장 큰 문제는 공유의 본성으로 인한 것이다.다음 질문을 참조하십시오.
function Person(){
}
Person.prototype = {
 constructor: Person,
 name: 'ccc',
 age: 18,
 friends:['www', 'aaa'],
 sayName: function () {
 console.log(this.name)
 }
}
var person1 = new Person()
var person2 = new Person()
person1.friends.push('bbb')
console.log(person1.friends)  // --> ["www", "aaa", "bbb"]
console.log(person2.friends)  // --> ["www", "aaa", "bbb"]
console.log(person1.friends === person2.friends)  // --> true만약 우리의 초지가 이렇다면, 모든 실례가 하나의 수조를 공용한다면, 이 결과는 바로 원하는 것이다.그러나 실례는 일반적으로 자신만의 모든 속성을 가져야 한다. 이 문제는 바로 우리가 원형 모델을 단독으로 사용하는 사람을 거의 보지 못하는 이유이다.
조합 사용 구조 함수 모드와 원형 모드
사용자 정의 형식을 만드는 가장 흔히 볼 수 있는 방법은 구조 함수 모드와 원형 모드를 조합하여 사용하는 것이다.구조 함수 모드는 실례 속성을 정의하는 데 사용되고, 원형 모드는 방법과 공유의 속성을 정의하는 데 사용된다.이런 방식은 구조 함수에 매개 변수를 전달하는 것도 지원한다.
function Person(name, age){
 this.name = name;
 this.age = age;
 this.friends = ['aaa', 'bbb']
}
Person.prototype = {
 constructor: Person,
 sayName: function(){
 console.log(this.name)
 }
}
var person1 = new Person('ccc', 18)
var person2 = new Person('www', 18)
person1.friends.push('ddd')
console.log(person1.friends)  // --> ["aaa", "bbb", "ddd"]
console.log(person2.friends)  // --> ["aaa", "bbb"]
console.log(person1.friends === person2.friends)  // --> false
console.log(person1.sayName === person2.sayName)  // --> true동적 원형 모드
동적 원형 모델은 어떤 존재해야 할 방법이 유효한지 검사함으로써 원형을 초기화해야 하는지 결정할 수 있다.
function Person(name, age){
 //  
 this.name = name
 this.age = age
 //  
 if(typeof this.sayName !== 'function'){
 Person.prototype.sayName = function(){
  console.log(this.name)
 }
 }
}
var person1 = new Person('ccc', 18)
person1.sayName()  // --> ccc참고:
기생 구조 함수 모델과 안정적인 구조 함수 모델도 있어 스스로 이해할 수 있다.이상의 지식 내용은 JavaScript 고급 프로그래밍(제3판)에서 나왔다.
이상은 js에서 자주 사용하는 몇 가지 디자인 모델에 대한 상세한 내용입니다. JS 디자인 모델에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.