programing

새 객체에서 JavaScript 프로토 타입 속성이 정의되지 않은 이유는 무엇입니까?

nicescript 2021. 1. 18. 07:40
반응형

새 객체에서 JavaScript 프로토 타입 속성이 정의되지 않은 이유는 무엇입니까?


저는 JavaScript의 프로토 타입 개념에 대해 상당히 새로운 개념입니다.

다음 코드를 고려하십시오.

var x = function func(){
}

x.prototype.log = function() {
  console.log("1");
}

var b = new x();

내가 이해했듯이 프로토 타입 b.log()이므로 1을 반환해야합니다 x. 그러나 속성이 b.prototype정의되지 않은 이유는 무엇입니까?

되지 않은 b.prototype받는 참조 반환하기로 x기능을?


생성자 함수에만 프로토 타입이 있습니다. x생성자 함수 이므로 x프로토 타입이 있습니다.

b생성자 함수가 아닙니다. 따라서 프로토 타입이 없습니다.

생성 한 함수 b(이 경우 x)에 대한 참조를 얻으려면 다음을 사용할 수 있습니다.

b.constructor

.prototype함수 속성은 함수가 생성자로 호출 될 때 새 객체에 대한 상속을 설정하기위한 것입니다.

새 객체가 생성되면 내부 [[Prototype]]속성이 함수의 .prototype속성이 가리키는 객체로 설정 됩니다.

객체 자체는 .prototype속성을 얻지 못합니다 . 객체와의 관계는 완전히 내부적입니다.

그것이 작동하는 이유 b.log()입니다. JS 엔진이 b객체 자체에 log속성 이 없음 을 확인하면 객체 내부 [[Prototype]]객체 를 조회 하여 성공적으로 찾습니다.

명확하게 말하면 [[Prototype]]속성에 직접 액세스 할 수 없습니다. JS 엔진에서 제공하는 다른 구조를 통해서만 간접적으로 변경할 수있는 내부 속성입니다.


JavaScript의 모든 일반 객체에는 내부 프로토 타입 슬롯이 있습니다 (참고 : 여기서 프로토 타입은 프로토 타입 속성을 참조하지 않음). ECMAScript 표준 ( http://www.ecma-international.org/ecma-262/6.0/index.html )은이 슬롯이 [[Prototype]]으로 참조되도록 지정합니다. __proto__ 속성을 통해이 슬롯에 액세스 할 수 있습니다.

__proto__는 여러 브라우저에서 안정적으로 사용할 수 없습니다. __proto__는 ECMAScript 6의 공식 자산이됩니다.

그러나 prototype 속성은 생성 된 객체에서 __proto__ 속성이되는 것을 설정하는 생성자 함수의 속성입니다.

특정 유형의 프로토 타입 속성 (예 : 핵심 JavaScript 유형 (날짜, 배열 등))에 액세스 할 수 있습니다. 또한 JavaScript 함수 (생성자로 간주 될 수 있음)에는 공용 프로토 타입 속성이 있습니다. 그러나 함수의 인스턴스에는 프로토 타입 속성이 없습니다.

이 경우, var b = new x();b는 함수 x의 인스턴스입니다. 따라서 b.prototype은 정의되지 않았습니다. 그러나 b에는 내부 [[Prototype]] 슬롯이 있습니다. b.__proto__Google Chrome에서 출력하는 경우 ( 예 : 버전 63.0.3239.132 또는 버전 43.0.4와 같은 Firefox)

console.log(b.__proto__);

아래와 같이 [[Prototype]] 슬롯이 표시됩니다.

{log: ƒ, constructor: ƒ}

그게 다야.


참조 용으로 전체 코드 스 니펫은 다음과 같습니다.

var x = function() {
};
x.prototype.log = function() {
  console.log("1");
}

var b = new x();
b.log();  // 1

console.log(b.prototype); // undefined
console.log(b.__proto__); // {log: ƒ, constructor: ƒ}
console.log(x.prototype); // {log: ƒ, constructor: ƒ}

코드를 살펴보기 전에 코드 동작을 이해하는 데 필요한 프로토 타입 개념을 확인하고 싶습니다.

  1. [[prototype]]자바 스크립트 객체의 숨겨진 속성입니다.이 숨겨진 속성은 Object.prototype(객체 리터럴로 만든 경우)에 대한 링크 일뿐입니다 [[prototype]]. 속성 에 액세스하는 표준 방법은 없습니다 .
  2. JavaScript의 함수는 객체이므로 [[prototype]]속성 도 있습니다 . 여기서 함수의 경우이 숨겨진 속성은에 대한 링크 Function.prototype입니다 [[prototype]]. 속성 에 액세스하는 표준 방법도 없습니다 .
  3. 이 숨겨진 링크와는 별도로 [[prototype]]함수 객체가 생성 될 때마다 숨겨진 prototype속성과 별 개인 속성이 그 안에 생성됩니다 [[prototype]].

이제 코드를 살펴 보겠습니다.

var x = function func () {}

이 행이 실행되면 x두 개의 링크가 있는 함수 객체 가 생성됩니다.

  • Function.prototype (액세스 할 수 없음),
  • x.prototype (액세스 가능).

x.prototype.log = function() { console.log("1"); }

as we know now that x is a function object so x.prototype is accessible, so here you are able to include log method with it.

var b = new x();

b is an object but not function object .It has that hidden link [[prototype]] but It is not accessible. so when you try to access like b.prototype it gives undefined as a result.If you want to check the prototype of b than you can see (x.prototype).isPrototypeOf(b); it will return true. so you can say that hidden link is referenced to x.prototype.

Here are some facts about prototype :

  1. If object O is created with O = new func(){} then O[[prototype]] is Function.prototype.
  2. If object O is created with O = {}then O[[prototype]] is Object.prototype.
  3. If object O is created with O = Object.create(obj) then O[[prototype]] is obj.

Because prototype is a property of functions (actually, constructors), since it defines the properties/methods of objects of this class (those which were created from the constructor this prototype belongs). Take a look at this link

ReferenceURL : https://stackoverflow.com/questions/14450731/why-is-javascript-prototype-property-undefined-on-new-objects

반응형