2016-09-09 5 views
0

JS에서 생성자 함수를 사용하여 새 객체를 만들고 프로토 타입 객체에 액세스하면 프로토 타입에있는 모든 속성을 볼 수 있습니다. (훨씬 더 명확한 코드에서) :노드 : "Class"구문을 사용하는 프로토 타입이 예상 객체를 표시하지 않습니다.

function F() { 
    this.attr = 42; 
} 
F.prototype.foo = function() { 
    return 'life'; 
} 

$> let f = new F(); 
undefined 
$> f 
F { attr: 42 } 
$> Object.getPrototypeOf(f) 
F { foo: [Function] } 

바로 여기 모두가 정상입니다.

는 지금, 나는 C {}을 결과하는 것은 나를 혼란이라는 동일한 시나리오

class C { 
    constructor() { 
    this.attr = 42; 
    } 
    foo() { 
    return 'life'; 
    } 
} 

$> let c = new C() 
undefined 
$> c 
C { attr: 42 } 
$> Object.getPrototypeOf(o) 
C {} 

을 만들기 위해 클래스 구문을 사용하겠습니다. foo 속성은 어디에 있습니까?c 개체에 없지만 내 C 프로토 타입에없는 것 같습니다!

+0

Chrome Dev Tools에서 코드를 실행했는데 객체를 확장 한 후'foo'가 표시됩니다. 'Object.getPrototypeOf (o) .foo'를 실행하여 그 객체에'foo'가 존재 함을 증명할 수도 있습니다. 귀하의 환경은 바로 그것을 표시하지 않습니다. –

+0

@MikeC 내 env가 노드 콘솔 – Manu

+2

그래서 클래스 전용 프로토 타입을 표시 할 때 Node는 프로토 타입의 모든 요소를 ​​표시하지 않습니다. 속성이 여전히 존재합니다. –

답변

3

아마도 콘솔에 개체를 표시 할 때 열거 할 수없는 속성이 포함되지 않는 것이 문제 일 수 있습니다. 첫 번째 경우

, 당신은 할당하여 속성을 만들고, 그래서 그들은 열거 있습니다

Object.getOwnPropertyDescriptor(F.prototype, 'foo').enumerable; // true 

을하지만 두 번째 경우에 그들은 왜 안 신뢰 객체가 있다고

Object.getOwnPropertyDescriptor(C.prototype, 'foo').enumerable; // false 

없습니다 콘솔의 표현. 당신은 객체의 자신의 속성을 나열하려면이 아마 작동합니다 : 콘솔이 제대로 배열도를 표시 할 수없는 경우

Object.getOwnPropertyNames(C.prototype); // [ "constructor", "foo" ] 

당신은 그 배열에 가입 할 수 있습니다.