객체를 작성하는 몇 가지 방법

4334 단어

1. 공장 모델


인터페이스로 봉인하여 특정 인터페이스로 대상을 만드는 세부 사항//단점: 대상은 식별할 수 없습니다. 모든 실례가 원형을 가리키기 때문입니다.
var log = console.log.bind(console)
function creatPerson(name) {
  var o = new Object()
  o.name = name
  o.getName = function () {
     console.log(this.name);
   };
   return o
}
var person = creatPerson('haha')
var person1 = creatPerson('haha')
log(1111, person.__proto__)  // Object
log(2222, person1.__proto__)  // Object

2. 구조 함수 모드


//장점: 실례는 특정한 유형으로 식별할 수 있다//단점: 실례를 만들 때마다 모든 방법이 한 번씩 만들어져야 한다
var log = console.log.bind(console)
function Person(name) {
  this.name = name
  this.getName = function() {
    log(this.name)
  }
}
var person2 = new Person('meimei')
var person3 = new Person('meimei1')
log(person2.name)  //meimei
// Person, , 
log(3333, person2.__proto__.constructor.name)  
log(person2.getName == person3.getName)  //false

2.1 구조 함수 모델 최적화


장점: 모든 방법이 다시 만들어져야 하는 문제점과 단점을 해결했다: 이게 무슨 봉인이야...
var log = console.log.bind(console)
function Person1(name) {
    this.name = name;
    this.getName = getName;
}
//  , 
function getName() {
    console.log(this.name);
}
var person4 = new Person1('kevin');
var person5 = new Person1('kevin1');
log(4444, person4.__proto__.constructor.name)   // "Person1"
log(person4.getName == person5.getName)  //true

3. 원형 모드


//장점: 방법은 다시 만들지 않는다//단점: 1.모든 속성과 방법을 공유합니다 2.매개변수를 초기화할 수 없습니다.
var log = console.log.bind(console)
function Person2() {}
//  name 
Person2.prototype.name = 'hah'
Person2.prototype.getName = function(){
    console.log(this.name);
}
var person6 = new Person2();  // name  
log(5555, person6.__proto__.constructor.name)  // "Person2"

3.1 원형 모델 최적화


//장점: 봉인성이 좀 좋아졌고 실례는 constructor 속성을 통해 소속 구조 함수를 찾을 수 있습니다//단점: 원형을 다시 썼는데 원형 모델이 있어야 할 단점이 있습니다
var log = console.log.bind(console)
function Person3() {}
Person3.prototype = {
  coustructor: Person3,
  name: 'hah',
  getName: function(){
     console.log(this.name);
  }
}
var person7 = new Person3();  // name  
log(6666, person7.__proto__.coustructor.name)  // "Person3"

4. 구조 함수 모드와 원형 모드를 조합하여 사용


//장점: 이 공유의 공유, 이 사유의 사유, 가장 광범위한 방식을 사용한다//단점: 어떤 사람들은 모두 함께 쓰기를 원한다. 즉, 더욱 좋은 봉인성이다.
var log = console.log.bind(console)
function Person4(name) {
  this.name = name
}
Person4.prototype.getName = function(){
    console.log(this.name);
}
var person8 = new Person4('haha'); 
log(7777, person8.__proto__.constructor.name)  // "Person4"

4.1 동적 원형 모델

var log = console.log.bind(console)
function Person5(name) {
  this.name = name
  if(typeof this.getName != 'function') {
    //  : , 
    Person5.prototype.getName = function() {
      log(this.name)
    }
  }
}
var person9 = new Person5('meimei')
log(8888, person9.__proto__.constructor.name)  // "Person5"

5.1 기생 구조 함수 모델


//기생-구조함수-모드, 즉 구조함수에 기생하는 방법이다.단점: 생성된 실례는 instanceof를 사용해도 구조 함수//특수한 상황에서 사용할 수 없습니다. 추가 방법이 있는 특수한 그룹을 만들고 싶지만 Array 구조 함수를 직접 수정하고 싶지 않습니다.
var log = console.log.bind(console)
function Person6(name) {
  var o = new Object()  
  o.name = name
  o.getName = function() {
    log(this.name)
  }
  return o
}
var person10 = new Person6('meimei') // new, 2 
console.log(person10 instanceof Person) // false
console.log(person10 instanceof Object)  // true
log(9999, person10.__proto__.constructor.name)  // Object

5.2 온당한 구조 함수 모델


//기생 구조 함수 모델과 두 가지가 다르다.//1) 새로 만든 실례 방법은this//2)를 인용하지 않는다. new 조작부호를 사용하지 않고 구조 함수를 호출한다//온당한 대상은 일부 안전한 환경에 가장 적합하다.온당한 구조 함수 모델도 공장 모델과 마찬가지로 대상 소속 유형을 식별할 수 없다.
var log = console.log.bind(console)
function Person7(name){
    var o = new Object();
    o.sayName = function(){
        console.log(name);
    };
    return o;
}

var person11 = Person7('kevin');
person11.sayName(); // kevin
person11.name = "daisy";
person11.sayName(); // kevin
console.log(person11.name); // daisy
log(1000, person11.__proto__.constructor.name)  // Object

자세히 보기: 효과 보기

좋은 웹페이지 즐겨찾기