새 객체에서 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: ƒ}
코드를 살펴보기 전에 코드 동작을 이해하는 데 필요한 프로토 타입 개념을 확인하고 싶습니다.
[[prototype]]
자바 스크립트 객체의 숨겨진 속성입니다.이 숨겨진 속성은Object.prototype
(객체 리터럴로 만든 경우)에 대한 링크 일뿐입니다[[prototype]]
. 이 속성 에 액세스하는 표준 방법은 없습니다 .- JavaScript의 함수는 객체이므로
[[prototype]]
속성 도 있습니다 . 여기서 함수의 경우이 숨겨진 속성은에 대한 링크Function.prototype
입니다[[prototype]]
. 이 속성 에 액세스하는 표준 방법도 없습니다 . - 이 숨겨진 링크와는 별도로
[[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 :
- If object
O
is created withO = new func(){}
then O[[prototype]] isFunction.prototype
. - If object
O
is created withO = {}
then O[[prototype]] isObject.prototype
. - If object
O
is created withO = Object.create(obj)
then O[[prototype]] isobj
.
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
'programing' 카테고리의 다른 글
vue.js 라우터 탐색 쿼리 변경에 대해 중복됨 (0) | 2022.07.03 |
---|---|
표 머리글의 텍스트 정렬 (0) | 2021.01.18 |
오류 코드 1292-잘못된 DOUBLE 값 잘림-MySQL (0) | 2021.01.18 |
ImportError : matplotlib에는 dateutil이 필요합니다. (0) | 2021.01.18 |
Windows 용 GitHub는 SSH 키를 어디에 보관하나요? (0) | 2021.01.18 |