What's "new" in JavaScript?

3979 단어 JavaScriptprototypeOO
낡은 곡 조 를 다시 연주 합 니 다. 자 바스 크 립 트 에서 new 조작 자 를 만 났 을 때 어떤 조작 을 실 행 했 습 니까?
뉴 가 무엇 을 만 들 었 는 지, 과정 은 어떤 것 일 까?
Function 대상 에 원형 방법 을 추가 하여 new 작업 을 모 의 할 수 있 습 니까?

Function.prototype.__new__ = function(){
	var emptyFunction = function(){};
	emptyFunction.prototype = this.prototype;
	var newObject = new emptyFunction();
	newObject.__proto__ = this.prototype;
	newObject.constructor = this.prototype.constructor;
	var returnedObject = this.apply(newObject, arguments);
	return (typeof returnedObject === 'object' && returnedObject) || newObject;
};

대부분의 코드 는 옛길 에서 왔 다.
<<JavaScript: the Good Parts>>
5, 6 줄 은 추가 적 인 보충 이다.
다섯 번 째 줄: 모든 JS 대상 은proto__속성, 지향 - 구조 기의 prototype. (많은 브 라 우 저 는 proto 에 접근 할 수 있 습 니 다. ie 는 안 됩 니 다.)
여섯 번 째 줄: 대상 의 constructor 는 구조 기 가 아니 라 구조 기의 prototype 대상 의 구조 기 를 가리 키 며 코드 로 설명 합 니 다.

function Person(name){
	this.name = name;
}
Person.prototype = {
	getName:function(){
		return this.name;
	}
}
var p = new Person("a");
alert(p.constructor === Person); //false
alert(p.constructor === Object); //true   4   Person.prototype.constructor === Object  Person.prototype = new Object(); Person.prototype.getName = function(){..}

이러한 constructor 지향 은 constructor (구조 기) 의 문자 적 의미 와 어 울 리 지 않 습 니 다. 우리 가 기대 하 는 것 이 아니 라 곤란 을 초래 할 수 있 습 니 다. 따라서 자주 볼 수 있 는 OO 지원 (YUI Kissy) 은 표 시 된 재 작성 constructor 유지 대상 의 constructor 지향 구조 기 를 사용 합 니 다.
그러나 new 에 대한 시 뮬 레이 션 에 서 는 브 라 우 저 에 있 는 new 와 일치 해 야 합 니 다: new Object.proto__ = this.prototype;
2 ~ 4 줄: 먼저 빈 Function 인 스 턴 스 를 가 져 오고 구조 기의 prototype 인용 을 가 져 옵 니 다. 이 는 구조 기 에서 정의 하 는 특유 의 속성 과 특권 방법 을 거 릅 니 다. 우선 prototype 의 순수 혈통 을 보장 합 니 다. 코드 로 설명 하 십시오.

function Person(name,age){
	this.name = name;
	this.age = age;
	this.getAge = function(){//    (privileged methods)         
		return this.age
	}
}
Person.prototype.getName = function(){ //              
	return this.name;
}//BTW:        Person      ,    "="    Person.prototype      (= new Objecct)   Person.prototype.constructor      .

일곱 번 째 줄: 새로 만 든 대상 의 prototype 의 무 손실 을 보장 한 후에 이 줄 코드 는 특유 의 속성 과 특권 을 보장 하 는 방법 은 새로 만 든 대상 에서 여전히 특유 한 것 이 고 특유 의 속성 과 특권 방법 은 구조 기 에 들 어 오 는 매개 변수 와 관련 이 있 습 니 다.apply 방법 을 통 해 구조 함수 기능 과 입력 매개 변 수 를 새로 구 축 된 대상 에 작용 합 니 다. 구조 함수 의 반환 값 을 returned Object 에 임시 저장 합 니 다.
여덟 번 째 줄: 새 대상 이 만 들 어 졌 습 니 다. returned Object 가 비어 있 지 않 으 면 returned Object 로 돌아 갑 니 다. 그렇지 않 으 면 새로 만 든 대상 으로 돌아 갑 니 다. returned Object 의 이 판단 도 이해 하기 어렵 지 않 습 니 다. 이 기능 을 이용 하여 단일 항목 (Singleton) 을 만 들 수 있 습 니 다. 예 를 들 어 이렇게 쓰 십시오.

function Singleton(){
	if(Singleton.inst){
		return Singleton.inst;
	}
	Singleton.inst = this;
}
var s1 = new Singleton();
var s2 = new Singleton();
alert(s1===s2);//true

또 하나의 고민 은 싱글 턴 앞 에 new 가 없 으 면 싱글 턴 인 스 트 가 윈도 우 를 가리 키 는 것 입 니 다.
사실 모든 종 류 는 new 를 통 해 들 어 온 함수 체 인지 아 닌 지 를 판단 해 야 합 니 다. 판단 하 는 방법 은 복잡 하지 않 습 니 다. YUI 를 참조 하여 instanceof 를 사용 하여 판단 할 수 있 습 니 다.

function Singleton(){
	if(this instanceof arguments.callee){ //      new     ,   this   window
		return new arguments.callee;
	}
	if(Singleton.inst){
		return Singleton.inst;
	}
	Singleton.inst = this;
}
var s1 = new Singleton();
var s2 = Singleton();
alert(s1===s2);//true

이것 이 바로 Function 에 원형 을 추가 하 는 방법new__new 연산 자 에 대한 시 뮬 레이 션 을 하 는 것 은 완선 되 지 않 을 수 있 지만 JS 내부 체 제 를 이해 하 는 데 도움 이 됩 니 다. 오류 가 있 으 면 꼭 지적 해 주세요 ~
마지막 으로 추천 해 드릴 게 요.
시리즈 문장.

좋은 웹페이지 즐겨찾기