2013-07-15 16 views
8

編集:今後この記事を参照している人々のために、this siteは間違いなくJavascriptを消化するために重要でした。あなたが伝統的なOOPの背景から来ているなら、私はそれを強く勧めます。 UML-esqダイアグラムは素晴らしいものでした。ラーニング.prototype

私はまだJavascriptの.prototypeプロパティが何であるかを頭に浮かべることはできません。それは単なる別のオブジェクトへの参照ですか?それとも別のオブジェクトへのポインタへの参照ですか?私はC/C++/x86から​​来て、それがどのように動作するかわかりません。私が現在どのように物事を見ているかの例を見てみましょう。私のエラーを指摘して、どのように動作するかを知ることができます。これらのうちのいくつかが有効な構文であるかどうかわかりません。 ObjectおよびFunctionはそれぞれグローバルオブジェクト/関数オブジェクトです。

私はとても混乱しています。

11 var Foo = function() { this.prop1 = 0; } 
12 var foo = new Foo();     // should it be 'new Foo' or 'new Foo()'? 
13 // Foo.prototype = Function 
14 // foo.prototype = Foo 
15 var Goo = function() { this.prop2 = 0; } 
16 var goo = new Goo(); 
17 // goo.prototype = Goo 
18 goo.prototype = new Foo(); 
19 // goo.prop1 now exists ? 

また、プロトタイプの交換についてもわかりません。

20 function A() { 
21  this.prop1 = 1; 
22 } 
23 function B() { 
24  this.prop2 = 2; 
25 } 
26 function C() { 
27  this.prop3 = 3; 
28 } 
29 C.prototype = new B(); 
30 var c = new C(); 
31 // c.prop1 = 1 
32 // c.prop2 = 2 
33 // c.prop3 = undefined 
34 C.prototype = new A(); 
35 // c.prop2 = 2??? 
36 // c.prop3 = 3 

私は概念を把握できません。私はかなり理解していない。クローンされたオブジェクトがローカルのデータコピーをどのように取得するのかはわかりませんが、元のオブジェクト(プロトタイプ)の変更は何らかの形でクローンにカスケードされます。私は物事を試すFigureBugの周りいじるしてきたが、精神的に私はすべての例と一致しているのアイデアを思い付くことができません

C++は巨大な怪物かもしれないが、少なくとも私は正確を知っているのを見アイブ何が起こっているの?ここに...私は最高の推測を使用しています。 私が推測するちょうど新しいパラダイム。とにかく、助けてくれてありがとう...私はこの.prototypeについては逆さまになっています。

+0

この質問で私の答えを確認してください:http://stackoverflow.com/questions/17047025/trying-to-standstand-javascript-inheritence/17049716#17049716 – Hoffmann

+0

obj.xを求めてobjにそれがない場合JSはobj.prototype.xの存在をチェックし、存在する場合はそれを返し、それ以外の場合はundefinedを返します。それをプログラミングのためのコールフォワーディングと考えると、プロトタイプはあなたがデータに到達しようとすることのできる別の番号です。別の電話機なので、代替回線が破棄された場合でもメイン回線を呼び出すことができます。 – dandavis

+0

@dandavis OKこのシナリオを取得します。どのような.prototypeが参照されているのか、デフォルトで何が設定されているのか、プロトタイプを交換するのはどうなるのでしょうか? – gone

答えて

4

うわー、それはたくさんの質問です。それらを処理しましょう。

単なる別のオブジェクトへの参照ですか?それとも別のオブジェクトへのポインタへの参照ですか?

JavaScriptにはポインタがありません。しかし、「オブジェクト」を保持する変数またはプロパティは実際にオブジェクトへの参照を保持しているため、他の変数は同じオブジェクトへの参照を保持できます。すべてのグローバル変数が定義されている

Global.prototype = ?? 

(必要に応じwindow)グローバルオブジェクト、(一部の環境で例外を気にしないでください)プロトタイプを持っていません。

私はまだJavascriptの.prototypeプロパティが何であるかを頭に浮かべることはできません。

.prototypeプロパティは、すべての関数オブジェクトが持つプロトタイプオブジェクト(プレーンオブジェクト)を指すプロパティです。

それぞれのオブジェクトに含まれるプロトタイプリファレンスと混同しないでください。そのプロトタイプは、オブジェクトが自身を持たないプロパティを参照するオブジェクトを指します。

Function.prototype = ?? 

これは、すべての機能オブジェクトが継承するオブジェクトです。それはcallまたはbindのようなものを含んでいます。ちょっと

var obj1 = {};    // obj1.prototype = Object 
var func1 = function() {}; // func1.prototype = Function 

はい、。私はあなたが概念を持っていると思うが、その用語を知らなかった。 func.prototypeは別のものですが、プロパティは存在しません。しかし、内部のプロトタイプを意味しました。Object.getPrototypeOf関数を介してアクセスできます。また、コンストラクタ関数を参照するのではなく、プロトタイプオブジェクトを参照します。ここに訂正があります:

Object.getPrototypeOf(obj1) === Object.prototype 
Object.getPrototypeOf(func1) === Function.prototype 

それは新しいのFoo 'または '新しいはFoo()' すべきですか?

これは問題ではありませんが、同等です。引数を渡すときは、括弧のみを明示的に指定する必要があります。

var Foo = function() { this.prop1 = 0; } 
var foo = new Foo(); 

ここでも、あなたの仮定が正しかったが、間違った表現。詳細を作業しましょう。

上記では、「プロトタイプオブジェクト」について説明しました。それらは何ですか?それらは、すべての関数で暗黙的に作成される明白なオブジェクトです。この場合は、Foo.prototype - 空のオブジェクトです。ここでは、Fooコンストラクタ関数、Foo.prototypeプロトタイプオブジェクト、およびfooインスタンスの3つのオブジェクトを扱います。

fooの特長は何ですか? newオペレータが行う最初のことです。ファンクションがコンストラクタとして呼び出されると(new)、その.prototypeプロパティがアクセスされ、新しいオブジェクトがその内部プロトタイプがそのプロトタイプオブジェクトに設定されてインスタンス化されます。それは奇跡的なことです。その後、新しいインスタンスに対して関数が呼び出され、thisが新しいオブジェクトになります。あなたのケースでは、インスタンスに.prop1プロパティを作成します。結果は返されます(そしてfooに割り当てられます)。

どのようにこの魔法を使うのですか?まず、プロトタイプオブジェクトにプロパティを作成し、継承します。

// modify `Foo.prototype`, the object which `foo` inherits from: 
Foo.prototype.prop2 = 1; 
console.log(foo.prop2); // 1! 

私も周りのスワッピングプロトタイプを理解していません。

問題は非常に不可能です。ひとたびインスタンス化されると、オブジェクトのプロトタイプチェーンは静的になります。しかし、あなたはそれを頻繁に必要としません。 .prototypeプロパティは、あなたが期待したものではありませんので動作しませんでした

goo.prototype = new Foo(); 

作業のみlittlebitを行い
var c = new C(); 
C.prototype = new A(); 

newが何であるかを上に見てください。それはコンストラクタの .prototypeプロパティを一度しか調べません。内部 プロトタイプはロックされたままです。 cインスタンスは変更されません。ただし、新しいインスタンス var d = new C()を作成する場合は、 Aインスタンスを継承します。

私はこれが役立つことを望みます。さらに質問があればコメントしてください。

+0

申し訳ありませんが、私はそれについて遅れていました。でも、はい。これだよ。 "問題は、これは非常に不可能です":正確に私が必要としたもの(あなたが言及したすべてのものと共に)>非常に感謝します。トップノッチ解答 – gone

2

プロトタイプは、読み取り中にオブジェクト自体に定義されていないプロパティを検索するために使用されます。あなたはN.B.

// An instance of Foo ({prop1:0}) is set as the 
// prototype (to all instances of Goo) 
var goo = new Goo(); 

// 0, from the prototype 
console.log(goo.prop1); 

// Read from the object itself (set in Goo's constructor) 
console.log(goo.prop2); 

// New instance, same prototype as goo 
var goo2 = new Goo(); 
console.log(goo2.prop1) ; // 0, still from the prototype 

// Setting is always at the object level, not the prototype 
goo.prop1 = 5; 

// goo2 is still reading from the prototype 
console.log(goo2.prop1); 
を呼び出すと常にオブジェクト自体

に起こる書き込み

継承を設定するだけで親クラスをインスタンス化しないでください。理由を見るhttp://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

関連する問題