2017-05-23 8 views
0

thisについて質問があり、クラスには通常の変数があります。 、だから私はnewthingyidが何であるか見当がつかないということを理解し"this"コンテキストを持つクラスの変数を受け入れる

class Thingy { 
    constructor(thing) { 
    let id = thing 
    } 
    printID() { 
    console.log(id) 
    } 
} 
let newthingy = new Thingy("ID1") 
let newthingy2 = new Thingy("ID2") 
newthingy.printID() 
newthingy2.printID() 

class Thingy { 
    constructor(thing) { 
    this.id = thing 
    } 
    printID() { 
    console.log(this.id) 
    } 
} 
let newthingy = new Thingy("ID1") 
let newthingy2 = new Thingy("ID2") 
newthingy.printID() 
newthingy2.printID() 

このようなものはないでしょうが、うまく働く:

通常、我々はこのような何かを元のクラスのプロトタイプでプロトタイプチェーンを見上げるだけではありませんか?私はそれがおそらく右idを得ることはないだろうが、id not defined errorを得るには、最初にプロトタイプのチェーンを調べるべきですか?

+0

「var」のようなものを考えてみましょう。あなたが関数を持ち、 'var something = '何らかの文字列'; 'を定義すると、' something'はそのメソッドの外部からアクセスできません。クラスの文脈で 'this'を使うと、クラスのどこからでもアクセスすることができます。 –

+0

2番目のスニペットでもvarと同じになります。 2番目のスニペットでletを使って達成しようとしていることは何ですか? – karthick

+0

このhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/letを参照してください。 –

答えて

1

これはプロトタイプとはまったく関係ありません。

「クラスメソッド」は、オブジェクトに対して機能する単なる機能に過ぎません。オブジェクトに作用する方法は、thisです。それだけです。それはオブジェクトであるthisへの暗黙のアクセス権を持つ通常の関数です。ご覧のとおり、あなたもthisのためclassを必要としない

function foo() { 
 
    console.log(this.bar); 
 
} 
 

 
foo.call({ bar: 'baz' }); 
 

 
let baz = { bar: 'baz' }; 
 
baz.foo = foo; 
 
baz.foo();

:JavaScriptでthisの値は通話時間で決定されているので、これは非常に可鍛性メカニズムであります作業。クラスは、単に特定のパターンにこれを正式に:

new Thingyは、新しいオブジェクトを作成し、その新しいオブジェクトにidプロパティを作成し、あなたがthis.id = thingを設定し、コンストラクタで、その上にThingyconstructorを呼び出します。 newthingy.printID()を呼び出すと、printID関数は以前に作成したオブジェクト(newthingy)に対してthisというコンテキストを設定しているので、this.idが機能します。

idの値は、オブジェクトのプロパティとしてconstructorからprintIDに転送されます。 idthis.idの代わりに)だけを使用すると、存在しないローカル変数にアクセスしようとしているだけです。

1

私はそれがすべて範囲についてだと信じています。あなたが言うとき...

let id = thing 

...実際には、コンストラクタメソッドのローカル変数を宣言しています。定義するとき...

...実際にはThingyインスタンスのプロパティ値を変更しています。また、printIDが "id"にアクセスしようとすると、 "id"を見つけるコンテキストがありません。

+0

私はX.objectのプロパティを定義することを忘れています.Xは 'newthingy'です。私が混乱しているのは、idが定義されることを "期待する"ことですが、実際には変数idを持つオブジェクトを実際に技術的に作ることは決してありません。つまり、クラス定義は単なる定義であり、それ自体はインスタンス化されません。 – msmith1114

+1

@ msmith1114:混乱は、人々(ほとんど混乱していると思われる人物)が2つの非常に異なる、互換性のない概念を混在させる傾向があることに由来します。バインディング(オブジェクトのプロパティがオブジェクトのインスタンスにバインドされる仕組み)コンパイラがどのように可変アクセス規則を実施するか)。プロパティは技術的には変数ではなく、変数は技術的にはプロパティではありません(ウィンドウオブジェクトとグローバル変数を区別します)。低レベルの実装を見ると、ほとんどのエンジンはそれらをルックアップチェーンとして実装しますが、プロトタイプチェーンとスコープチェーンの2種類のチェーンがあります – slebetman

1

'constructor'と 'printID'は両方とも関数です。それらで定義された変数には他人がアクセスできません。

関連する問題