3

重複の可能性:
JavaScript .prototypeはどのように機能しますか?

Javaのバックグラウンドから来て、私はjavascriptを理解しようとしています。

これらが正しいかどうか教えてください。

  1. Javaと同様に、他のすべてのオブジェクトが継承する最高のオブジェクトがあります。
  2. プロトタイププロパティは、親オブジェクト(Javaのクラス)を指すポインタのようなものです。
  3. 「オブジェクト」オブジェクトの場合、プロトタイプはnullです。
  4. プロトタイププロパティの値は、オブジェクトの命名法を示す文字列であり、Cのようなポインターではありません。ポインターの概念は、スクリプトではアクセスできない非表示の属性[[PROTOTYPE]]を使用して実装されます。

私はJSを学ぶためにブラウザの代わりにnode.jsを使用しています。私は試した、

var human = Object.create(null);  // same as var human;
console.log(Object.getPrototypeOf(human)); //null

var man  = Object.create(human);
console.log(Object.getPrototypeOf(man));
//{}
//expected 'human'

var person = Object.create(Object.prototype); // same as var person = {}
console.log(Object.getPrototypeOf(person));
//{}
//expected 'object'
4

3 に答える 3

0

createまず、メソッドを使用する前に、メソッドについて読む必要があります。

次に、次の方法でオブジェクトを呼び出します。

var human = {}, man = {}, person = {};

第三に、これはJavaではありません。Javaクラスでは、クラスを理解することが非常に重要です。JavaScriptではプロトタイプは完全にオプションです。プロトタイプによって提供される唯一のパフォーマンス上の利点は、コードがさまざまなスコープで参照によって関数を大量に再利用する場合に発生します。このスタイルのコーディングが当てはまらない場合は、プロトタイプを使用する必要はないでしょう。

プロトタイプは、親または一部の祖先オブジェクトから継承されます。JavaScriptパーサーは、最初にローカル割り当てを探し、存在しない場合は、現在のオブジェクトのプロトタイプを調べて、名前付き参照が存在するかどうかを調べます。一言で言えば、JavaScriptを作成するこの初期の時点で知っておく必要があるのはこれだけです。

于 2012-07-27T18:10:48.947 に答える
0
  1. Object.create(null)はい、何も継承しないことを除いて。
  2. 「親オブジェクト」が何であるかはわかりませんが、関数のプロトタイプは、インスタンスからアクセスできる関数で構成されています。存在するのでObject.prototype.toString、そう{}.toStringです-それは継承されます。
  3. はい、プロトタイプチェーンはここで終わります。
  4. いいえ、.prototype(またはによって返される値Object.getPrototypeOf)は、プロパティを使用して拡張できるオブジェクトであるため、これらのプロパティはインスタンスに継承されます。

あなたの例:

var human = Object.create(null);  // same as var human;

いいえ、何も継承しない空のオブジェクトを作成します。var human;-に設定humanundefinedます。これはオブジェクトではなくプリミティブ値です(JavaScriptではすべてがオブジェクトであるとは限りません)。

var man  = Object.create(human);
console.log(Object.getPrototypeOf(man));
//{}
//expected 'human'

Object.getPrototypeOf(man)オブジェクトを返しますhuman。これは空のオブジェクトです。ノードはそれをとして表示し{}ます。文字列ではありません。実際、オブジェクトは複数の変数に割り当てることができます。オブジェクトには変数がバインドされていないため、設計上、文字列を取得することはまったくできません。同等性をチェックするために、あなたはObject.getPrototypeOf(man) === humanをもたらすことができますtrue

var person = Object.create(Object.prototype); // same as var person = {}
console.log(Object.getPrototypeOf(person));
//{}
//expected 'object'

これは確かに同じです{}-から直接継承する空のオブジェクトObject。上で述べたように、プロトタイプはObject.prototype文字列ではなく、文字列です。空に見えますが、これはObject.prototypeの関数がデフォルトで使用可能で非表示になっているためです。

于 2012-07-27T18:10:50.337 に答える
0

まず、IMO、ノードから始めないでください。javascriptをまだ知らない場合、Nodeはあなたを流砂のプールに引きずり込みます。次に、関数ベースのコードから始めたとき、次にOO、そしてそれからプロトタイプに移りました。しかし、本当に知りたいのであれば、この質問はすでにここで回答されています。他にご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-07-27T18:12:06.527 に答える