2016-09-18 11 views
0
function Circle(radius) { 
    this.radius = radius; 
} 

私はオブジェクトとプロトタイプをコンソールで再生して理解しようとしています。私は "サークル"を試したとき、それは機能を与えた。しかし、私はCircle.prototypeを試したときにオブジェクトを与えました。 Circleはどのようにしてプロトタイプのプロパティを取得しましたか?コンストラクタとObjectのプロトタイプがあります。いくつかのいずれかの円を作成するために、あなたのコードを使用するには関数のプロトタイプはどのように作成されますか?

enter image description here

+0

'.prototype'はオブジェクトなので常にそこにあります。 – zerkms

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain – Mchl

+0

サークルは機能ですか? –

答えて

0

この階層構造を説明し、あなたがnew Circle(10);を使用することもできますし、後でそのサークルを使用したい場合は、var circ = new Circle(10);。それは、あなたが望むように使用するための新しいサークルオブジェクトを作成します。

Circleは、別の種類の変数またはオブジェクトです。 Circleと設定し、Circleと入力すると、関数自体が返されます。新しいサークルではありません。すべての単一の関数にはいくつかのプロパティがあり、prototypeがその1つです。

prototypeオブジェクトは、すべての機能の一部であり、クラスの操作に使用されます。あなたはそれについてhereを読むことができます。

2

新しい関数を作成すると、JSは名前、長さ、プロトタイプのプロパティを持つ新しい関数オブジェクトを作成します。名前は関数名で、lengthは引数の数です。プロトタイプは、JSが最初の関数オブジェクトへの参照であるコンストラクタ・プロパティを使用して作成する新しいオブジェクトへの参照です。したがって、関数を作成すると、実際には2つの新しいオブジェクト、関数オブジェクトとプロトタイプオブジェクトが作成されます。あなただけの機能部をしたい場合は、

http://www.objectplayground.com/

を分午前16時40分に行く:

詳細については、この30分の講義を参照してください。

0

Javascriptでは、関数はオブジェクトです。すべてのオブジェクトには、秘密のプロトタイププロパティが関連付けられています。 Circleが関数なので、Circleのプロトタイプは関数のプロトタイプです。 すべてのオブジェクトが派生するルートオブジェクトはObjectオブジェクトなので、Objectオブジェクトに到達するまでプロトタイプチェーンを歩くことができます。 Cirleをコンストラクタとして使用してnewを使用する場合は、Circleのインスタンスになる他のオブジェクトを作成し、そのプロトタイプがCircle.prototypeを指すことを意味します。 プロトタイプの仕組みの詳細については、オンラインで非常に良い資料があります。 例えば、http://eloquentjavascript.net/「データ構造:オブジェクトと配列」の章を読んでください。

Circleのプロトタイプを確認するには、Object.getPrototypeOf(Circle)を実行して、これがFunctionプロトタイプであることを確認します。

+0

これは正しいですが、今OPが尋ねていることです。 – Bergi

1

「すべてのオブジェクトにプロトタイププロパティがある」という記述を読んだとき、誤解が生じると思います。

機能Javascriptはオブジェクトです。すべてのオブジェクトと同様に、関数にはいくつかのプロパティとメソッドがあり、長さプロパティ、プロトタイププロパティ、call()apply()メソッド、bind()メソッドなどがデフォルトで定義されています。だから、この関数はデフォルト

function myfunc(){ 
    return "yes I'm a function"; 
} 

//I said that function are objects having properties and methods 
//this means you can call them, for example 
myfunc.prototype 

により、prototypeプロパティを持っており、あなたは、このプロパティを呼び出しからの戻りで持っている値がオブジェクトであることがわかります。さて、ここでは機能についてここでやめてください。

さて、あなたはnewキーワード

var myobj = new myfunc() 

と一緒に関数を呼び出し、新しいオブジェクトを作成することができますので、あなたは、コンストラクタとして任意の関数を使用することができますし、新しいオブジェクトを持つことになります。機能は、prototypeプロパティを持つオブジェクトにはありません。このオブジェクトは、私たちはオブジェクトのprototypeプロパティを話すことができないデフォルト

myobj.proptotype //=> unefined 

ことではない prototypeプロパティを持っています。

しかし、それはプロパティとメソッドを継承しているから、プロトタイプオブジェクトに関連付けられた各オブジェクト。プロトタイプオブジェクトの価値を見たいですか?ソリューションの1つは

myobj.__proto__ 

です。カスタムオブジェクトのプロトタイプオブジェクトの値が表示されます。

myobj.__proto__の値とmyfunc.prototypeの値を見てください。これらは同じです。これは、新しいオブジェクトのプロトタイプとして、コンストラクタのプロトタイププロパティ(つまり、新しいオブジェクトを作成するためにnewキーワードで使用する関数のプロトタイププロパティ)が使用されることを意味します。

念頭に置いてください。

関数はオブジェクトなので、関数はデフォルトでプロパティとメソッドを持ちます。

関数にはプロトタイププロパティがあります。

関数をコンストラクタとして使用して、新しいオブジェクトを作成します。ない prototypeプロパティ持っ

オブジェクト。

オブジェクトには、プロトタイプオブジェクトがあります。

プロトタイプオブジェクトの値は、コンストラクタのプロトタイププロパティと同じです。

関連する問題