What's "new" in JavaScript?
3979 단어 JavaScriptprototypeOO
뉴 가 무엇 을 만 들 었 는 지, 과정 은 어떤 것 일 까?
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 내부 체 제 를 이해 하 는 데 도움 이 됩 니 다. 오류 가 있 으 면 꼭 지적 해 주세요 ~
마지막 으로 추천 해 드릴 게 요.
시리즈 문장.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.