2016-09-09 1 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 My envはノードコンソールです – Manu

+2

したがって、クラス固有のプロトタイプを表示するとき、Nodeはプロトタイプのすべての要素を表示しません。プロパティはまだ存在します。 –

答えて

3

おそらく、問題は、オブジェクトを表示するときにコンソールに列挙できないプロパティが含まれていないことです。

あなたの最初のケースでは、あなたが割り当てによってプロパティを作成するので、彼らが列挙されている:

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

しかし、あなたがオブジェクトを信用してはならない理由です彼らは

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

でない第2のケースでコンソール内の表現。あなたがオブジェクトのすべての独自のプロパティを一覧表示したい場合、これはおそらく動作します:

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

あなたのコンソールが適切に配列どちらを表示することができない場合は、そのアレイに参加することをお勧めします。

関連する問題