[javascript] 네이티브 개체와 호스트 개체의 차이점은 무엇입니까?

후자는 사용자 지정 생성자 (예 : var bird1 = new Bird ();)에 의해 생성 된 기본이 아닌 함수 객체를 단순히 참조합니까?



답변

두 용어 모두 ECMAScript 사양에 정의되어 있습니다.

네이티브 개체

호스트 환경이 아닌이 사양에 의해 의미가 완전히 정의 된 ECMAScript 구현의 객체.

참고 표준 네이티브 개체는이 사양에 정의되어 있습니다. 일부 기본 개체는 기본 제공됩니다. 다른 것들은 ECMAScript 프로그램의 실행 과정에서 구성 될 수 있습니다.

출처 : http://es5.github.com/#x4.3.6

호스트 개체

ECMAScript의 실행 환경을 완료하기 위해 호스트 환경에서 제공하는 객체입니다.

참고 네이티브가 아닌 모든 개체는 호스트 개체입니다.

출처 : http://es5.github.com/#x4.3.8


몇 가지 예 :

기본 객체 : Object(생성자), Date, Math, parseInt, eval, 문자열과 같은 방법 indexOfreplace, 배열 방법, …

호스트 객체 (브라우저 환경을 가정) : window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, …


답변

세 종류의 객체를 구별하면 더 분명합니다.

내장 객체 : String, Math, RegExp, Object, Function등 – 자바 스크립트에서 항상 핵심 미리 정의 된 개체를 사용할 수 있습니다. ECMAScript 사양에 정의되어 있습니다.

호스트 오브젝트 : 같은 객체 window, XmlHttpRequest브라우저 환경에서 제공되는 등, DOM 노드와,. 모든 환경에 동일한 호스트 개체가있는 것은 아니기 때문에 기본 제공 개체와 구별됩니다. JavaScript가 브라우저 외부에서 실행되는 경우 (예 : Node.js와 같은 서버 측 스크립팅 언어) 다른 호스트 개체를 사용할 수 있습니다.

사용자 개체 : JavaScript 코드에 정의 된 개체입니다. 따라서 귀하의 예제에서 ‘Bird’는 사용자 개체입니다.

자바 스크립트 사양은 기본 개체 와 사용자 개체를 함께 네이티브 개체 로 그룹화 합니다 . 이것은 “네이티브”라는 용어의 비 정통적인 사용입니다. 사용자 객체는 분명히 자바 스크립트로 구현되는 반면, 내장은 호스트 객체처럼 내부적으로 다른 언어로 구현 될 가능성이 높기 때문입니다. 그러나 JavaScript 사양의 관점에서 볼 때 내장 및 사용자 개체는 모두 JavaScript 사양에 정의되어 있지만 호스트 개체는 그렇지 않기 때문에 JavaScript에 기본적으로 적용됩니다.


답변

사양에 대한 나의 이해는 다음과 같습니다.

이:

var bird = new Bird();

new연산자를 사용하여 생성 된 네이티브 개체가 생성됩니다 .

네이티브 개체에는 다음 중 하나의 내부 [[Class]] 속성이 있습니다.

“Arguments”, “Array”, “Boolean”, “Date”, “Error”, “Function”, “JSON”, “Math”, “Number”, “Object”, “RegExp”및 “String” .

귀하의 bird1경우 :

“목적”

함수를 생성하는 것처럼 :

function my_func() {
    // ...
}

my_func은 ECMAScript에 정의되어 있지 않지만 내부 [[Class]]가있는 네이티브 개체입니다.

“함수”

호스트 개체는 사양에 정의되지 않은 환경에 특정 목적을 제공하기 위해 환경에서 제공하는 개체입니다.

예를 들면 :

var divs = document.getElementsByTagName('div')

에서 참조하는 객체 divsNodeList 이며, 일반 JavaScript 객체처럼 느껴지는 방식으로 환경에 통합되지만 사양에 의해 어디에도 정의되어 있지 않습니다.

내부 [[Class]] 속성은 다음과 같습니다.

“NodeList”

이를 통해 구현 디자이너는 환경의 특정 요구 사항에 맞게 구현할 수있는 유연성을 제공합니다.

사양 전체에 정의 된 호스트 개체의 요구 사항이 있습니다 .


답변

var bird1 = new Bird();네이티브 또는 호스트 개체 인지 질문에 대한 설득력있는 답변을 볼 수 없습니다 . Bird가 사용자 정의 함수라고 가정하면 javascript 구현에 의해 http://es5.github.io/#x13.2 에 따라 기본 비 내장 객체가 생성됩니다 . 대조적으로, 기본 내장객체는 자바 스크립트 프로그램 (Object 및 기타 여러 프로그램)이 시작된 이후에 존재합니다. 네이티브 개체와 호스트 개체의 차이점은 전자는 자바 스크립트 구현에 의해 생성되고 후자는 호스트 환경에 의해 제공된다는 것입니다. 결과적으로 호스트 개체 내부 [[class]] 속성은 내장 개체에서 사용하는 속성과 다를 수 있습니다 (예 : “인수”, “배열”, “부울”, “날짜”, “오류”, “함수”, “). JSON “,”Math “,”Number “,”Object “,”RegExp “및”String “).

또한 ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf 는 더 이상 네이티브 및 호스트 개체라는 용어를 사용하지 않습니다. 대신 의도 된 동작에 대한보다 명확한 설명과 함께 아래의 개체 유형을 정의합니다.

4.3.6 일반 객체

모든 개체에서 지원해야하는 필수 내부 메서드에 대한 기본 동작이있는 개체

4.3.7 이국적인 개체

모든 개체에서 지원해야하는 필수 내부 메서드 중 하나 이상에 대한 기본 동작이없는 개체 참고 일반 개체가 아닌 개체는 이국적인 개체입니다.

4.3.8 표준 개체

이 사양에서 의미가 정의 된 객체

4.3.9 내장 객체

ECMAScript 구현에 의해 지정되고 제공되는 객체


답변

Host Objects에 관한 다른 답변 외에도.

호스트 개체는 환경에 따라 다릅니다. 따라서 브라우저 호스트 개체 다음에는 nodejs에 대한 특정 개체도 있습니다.

예를 들어, 먼저 Javascript에 정의 된 표준 객체로 시작합니다. 그런 다음 브라우저 / DOM의 공통 개체입니다. 노드에는 자체 개체가 있습니다.

  1. 표준 자바 스크립트 내장 객체 예 :

  2. 호스트 개체 문서 개체 모델 예 :

  3. Node.js의 호스트 객체 :


답변

호스트, 네이티브, 사용자 지정의 세 가지 개체를 고려합니다.

호스트 개체는 환경에 의해 생성되며 환경에 따라 다릅니다. 가장 잘 알려진 환경은 웹 브라우저이지만 다른 플랫폼 일 수 있습니다. 웹 브라우저에서 만든 호스트 개체는 창 개체 또는 문서 일 수 있습니다. 일반적으로 브라우저는 API를 사용하여 문서 개체 모델을 JavaScript에 반영하는 호스트 개체를 만듭니다. (웹 브라우저에는이를 수행하는 다른 JavaScript 엔진이 있습니다.) 호스트 개체는 브라우저에서 페이지가 렌더링되는 순간 자동으로 생성됩니다.

네이티브 개체는 미리 정의 된 JavaScript 클래스를 사용하여 개발자가 만듭니다. 네이티브 개체는 작성된 스크립트에 있습니다.

사용자 지정 개체는 개발자가 사용자 지정 (미리 정의되거나 부분적으로 미리 정의되지 않은) 클래스에서 만들어집니다.


답변

기본 개체는 사양을 준수하는 개체, 즉 “표준 개체”입니다.

호스트 개체는 브라우저 (또는 Node와 같은 다른 런타임 환경)가 제공하는 개체입니다.

대부분의 호스트 개체는 네이티브 개체이며를 사용하여 무언가를 인스턴스화 할 때마다 new이상한 호스트 개체를 다루지 않는 한 99.99 %가 네이티브 개체임을 확신 할 수 있습니다.

이 개념은 IE (및 다른 오래된 브라우저) 에 매우 기괴한 개체가 존재하기 때문에 도입되었습니다 . 예를 들면 :

typeof document.all == "undefined"; // true
document.all.myElementId; // object

이것을 볼 때 모든 사람 document.all은 분명히 “비표준”이므로 비원시 호스트 개체 라는 데 동의 할 것 입니다.

그렇다면 처음부터 네이티브 개체 표준 개체 를 호출하지 않는 이유 는 무엇입니까? 간단한 : 모든 후 (!) 표준 문서 비 네이티브 너무 객체, 그들에게 호출에 대해 이야기 비표준는 역설적으로 이어질 것입니다.

다시:

  • 네이티브 == “표준”
  • 호스트 == 브라우저 또는 노드에서 제공 또는…
  • 대부분의 호스트 개체는 네이티브이고 모든 비 호스트 개체도 네이티브입니다.