new 가 실례 화 할 수 없 는 구조 함 수 를 만 드 는 방법

1712 단어 웹 전단
알다 시 피 js 에 서 는 진정한 배 고 픈 개념 이 없다 (이후 버 전이 추 가 될 것 이다). 보통 우리 가 말 하 는 클래스 는 new 로 인 스 턴 스 를 구성 하 는 일반 함수 이다.
일반적으로 구조 함 수 를 실례 화 할 때, 안의 this 는 실례 화 된 실례 를 가리킨다.다음 예제 에서 보 듯 이:
function Ins(){
    this.a = 1;//this        ins  
    this.b = 2;
}

var ins = new Ins();

그러나 때때로 우 리 는 new 가 아 닌 함 수 를 직접 실행 하여 실례 화 하려 고 한다.이 럴 때 구조 함수 안의 this 지향 은 더 이상 실례 화 된 실례 가 아니 라 Ins 함수 의 수용자 전역 변수 window 가 되 고 엄격 한 모드 에서 오 류 를 직접 던 집 니 다.
일반적인 해결 방안 은 this 가 구조 함수 의 인 스 턴 스 인지 판단 하 는 것 입 니 다. 그렇지 않 으 면 new 작업 을 합 니 다.코드 는 다음 과 같 습 니 다:
function Ins(a,b){
    if(!this instanceof Ins){
        return new Ins(a,b);
    }
    this.a = a;
    this.b = b;
}

구조 함수 매개 변수 개수 가 고정된 상황 에서 이런 방안 은 실행 가능 하 다.이런 방식 의 단점 중 하 나 는 추가 함수 호출 이 필요 하기 때문에 대가 가 좀 높다 는 것 이다.
구조 함수 의 실례 화 를 진행 할 때 구조 함수 내부 에 return 문장 반환 값 이 명확 하지 않 으 면 이 구조 함 수 는 자동 으로 하나의 실례 대상 을 구성 하여 되 돌려 줍 니 다. 그러나 만약 에 우리 가 간단 하지 않 은 데이터 형식 (간단 한 데이터 형식 은 자동 적 으로 실례 대상 을 되 돌려 줍 니 다) 의 대상 을 명확 하 게 되 돌려 준다 면구조 함수 가 실례 화 될 때 돌아 오 는 것 이 바로 이 대상 이다.이렇게 하면 우 리 는 다음 과 같은 통용 상황 에서 의 구조 함 수 를 구성 할 수 있다.
function Ins(a,b){
    var self = this instanceof Ins?this:Object.create(Ins.prototype);
    self.a = a;
    slef.b = b;
    return self;
}
Object. create () 는 원형 대상 을 매개 변수 로 하고 이 원형 대상 을 계승 하 는 새로운 대상 을 되 돌려 야 합 니 다.
Object. create () 함 수 는 ES5 환경 에서 만 유효 합 니 다. 일부 오래된 환경 에서 부분 적 인 구조 함 수 를 만 들 고 new 연산 자 를 사용 하여 이 구조 함 수 를 초기 화 하여 Object. create 를 대체 할 수 있 습 니 다.
if(typeof Object.create === "undefined"){
    Object.create = function(prototype){
        function F(){}
        F.prototype = prototype;
        return new F();
    }
}

좋은 웹페이지 즐겨찾기