2014-01-23 3 views
2

JavaScript 함수의 프로토 타입 체인에서 함수가 어디에 있습니까?JavaScript 함수 프로토 타입 : Object, Function 또는 Both?

작업 예 :

> var f = function() { alert(1); } 

f()에 호출이 제대로 다음과 같은 콘솔 문을 기능 검사시 숫자 1의 경고 결과 :

크롬의 콘솔에서, 나는 다음과 같은 기능을 만들어
> console.dir(f) 

프로토 타입이 키/값 쌍인 prototype: Object의 형식으로 Object로 나열되는 방법에 유의하십시오. 즉, f이 Object에서 직접 상속 받음을 의미합니다. 충분히 공정하다. JavaScript의 배열 및 기타 엔터티는 Object에서 상속받습니다.

다음 관찰 결과 충돌이 발생합니다. 다음 명령을 입력하십시오.

f instanceof Function 

결과는 true입니다.

내가 이해하는대로 사용자가 만든 함수는 Function 개체에서 상속되며 Object 개체에서 상속됩니다. 그러나 나에게있어서 f를위한 프로토 타입 체인을 검사하여 찾을 수는 없다.

여기서 함수 f의 프로토 타입 체인에 Function이 있습니까?

tyvm

답변

1

어디 함수 f에 대한 프로토 타입 체인 함수?

Function 자체가 Function.prototype이다, 아니다.

  f 
     | 
     v 
Function.prototype 
     | 
     v 
    Object.prototype 
     | 
     v 
     null 

공지 프로토 타입은 키/값 쌍 프로토 타입의 형태로, 객체로 표시됩니다 방법 :이 기능 f "아래"잘해야 객체는 같은 표시되는 내용

.prototype 속성이 f 인 경우 함수의 자체 프로토 타입 객체입니다. f이 생성자라고 가정하면 모든 new f 인스턴스는 f.prototype에서 상속됩니다.

의미는 함수 f가 Object에서 직접 상속 받음을 의미합니다.

아니요. 일반 .prototype 속성을 내부 프로토 타입 체인 (일반적으로 [[prototype]] 내부 속성으로 표시)과 혼동해서는 안됩니다. Object.getPrototypeOf으로 프로토 타입 체인에 액세스 할 수 있습니다. 이에 대한 자세한 내용은 __proto__ VS. prototype in JavaScript입니다. Why functions prototype is chained repeatedly? 또는 http://eloquentjavascript.net/chapter8.html 일 수 있습니다.

+0

다이어그램 정확히 내가 자바 스크립트 상속을 이해하는 방법입니다거야 ... 그러나 콘솔 로그 명령문은 그에 대응하지 않습니다! 1. Function.prototype이 'f'함수의 '아래'에 나열되지 않습니다. 2. Object.getPrototypeOf (f)는'function Empty() {}'를 생성합니다. 오. 오? 이것이 퍼즐에 어디에 들어 맞습니까? 3. 공개 및 내부 프로토 타입 속성에 대한 추가 정보를 얻을 수있는 링크를 권장한다면 매우 유용 할 것입니다. – kmiklas

+0

또한, (Empty() {}). isPrototypeOf (f) 함수를 사용하면 프로토 타입이 첫 번째라고 말한 것입니다. – Mike

+0

@kmiklas : 1. 어떤 브라우저 (어떤 콘솔)를 사용하고 있는지 알 수 없습니다. 'console.dir'는 적어도 자신의 속성을 보여줍니다 ('.prototype'), 아마도 프로토 타입 체인 객체를 확장 목록에 포함 할 수 있습니다. 그렇지 않다면 대신'console.log (f)'를 시도하십시오. 2. 예, Object.getPrototypeOf (f) === Function.prototype'은'function Empty() {}'로 표시됩니다. 붙여 넣을 때 다른 함수를 만들고 있음을 알 수 있습니다. 'Function.prototype.isPrototypeOf (f)'를 시도하십시오 : – Bergi

0

저는이 스레드에서 정보를 찾는 사람들을 위해 처음부터 시작하고 있습니다.

kmiklas는 모든 것을 무시하고 끝에있는 링크로 바로 이동할 수 있습니다. Javascript에 대해 잘 모르는 다른 사용자는 아래에서 계속 읽어야합니다.

// 시작과 동시에 시작.

JavaScript에서는 거의 모든 것이 객체입니다. 원시 데이터 유형 (null 및 undefined 제외)조차도 객체로 처리 할 수 ​​있습니다. 문자열 또한 객체 또는으로 처리 기본 데이터가 날짜는 항상 객체입니다 오브젝트있는 객체로 취급 개체 또는 기본 데이터가 될 수 숫자를 객체로

부울 치료 개체 또는 기본 데이터가 될 수 수학 및 정규 표현식 항상 객체입니다 배열은 항상 객체입니다. 짝수 함수는 항상 객체입니다.

JavaScript는 객체 지향 언어이지만 JavaScript는 클래스를 사용하지 않습니다.

JavaScript에서는 클래스를 정의하지 않고 (대부분의 다른 객체 지향 언어 에서처럼)이 클래스에서 객체를 만듭니다.

JavaScript는 클래스 기반이 아닌 프로토 타입 기반입니다.

자바 스크립트의 모든 객체에는 프로토 타입이 있습니다. 메시지가 객체에 도달하면 JavaScript는 객체의 속성을 먼저 찾은 다음 객체를 찾지 못하면 객체의 프로토 타입 등에 메시지를 보냅니다. 이것은 클래스 기반 언어에서 단일 부모 상속과 똑같이 작동합니다.

프로토 타입 상속 체인은 원하는만큼 오래 갈 수 있습니다. 그러나 일반적으로 코드가 이해하고 유지하기 어려워지면 긴 사슬을 만드는 것은 좋은 생각이 아닙니다.

-------> More info on Prototypes and Javascript (VERY USEFUL!!!) <-------

+0

귀하의 기여에 감사드립니다. 그러나 귀하는 질문과 무관 한 내용을 게시해서는 안됩니다. 상상해 보니 남은 것은 [링크 만 대답] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers)입니다. 귀하는 귀하의 링크로 질문에 대한 의견을 말했거나 답변에 해당 블로그 게시물의 관련 부분을 포함시킬 수 있습니다 (인용문) – Bergi

0

난 당신이 자바 스크립트 프로토 타입 체인을 오해 생각합니다. 콘솔이 시도 :

function AnObject(){ 

} 

AnObject.prototype = { 
    aMethod: function() { 
     return "hi"; 
    } 
} 

new AnObject().aMethod() 지금 "안녕하세요"를 반환합니다.

AnObject.prototype이 AnObject ancestor를 반환 할 수 없다는 것을 알 수 있습니다. 실제로 AnObject 인스턴스에 복사 할 메소드로 덮어 쓰게됩니다. 당신이 anObject를 기능의 유형, 당신은 AnObject.constructor을 사용할 수 있습니다 알고 싶다면

AnObject.prototype 지금

{ 
    aMethod: function() { 
     return "hi"; 
    } 
} 

반환, 당신은 function Function() { [native code] }

관련 문제