プロトタイプベースのOOPの基本を理解するための簡単なJavascriptコード[終了]


8

私はしばらくJavaScriptを知っていますが、私はヘビーユーザーではありませんが、ネットスケープが私のブラウザだった頃から初めて知っていました。私は主なことをほとんど理解していますが、JavaScriptによるOOPへのアプローチは典型的なものであるため、把握するのに問題があります。

これに追加する1つの問題は、物事は複数の方法で行うことができるようです。ここでは、すべての例をテーブルに載せているため、本があまり役に立たないところです。

最初に必要なのはそれを行う唯一の方法です。もし誰かがプロトタイプのOOPモデルがどのように機能するかを見ることができる例の最も単純なコードで私を助けることができるなら?

役立つために、コードは継承されたオブジェクトを持ち、親のプロパティとその継承されたプロパティと親の関数にアクセスし、親の関数を上書きし、オブジェクトが他の2つのオブジェクトを継承する多重継承のインスタンスを持つ必要があります。


こんにちは、少し遅れてプログラマへようこそ。残念ながら、この質問は明示的に5つの質問とその他の暗黙の質問です。これにより、非常に焦点が合わなくなり、おそらく閉じられます。あなたがあなたの質問に集中することができるなら、それはサイトガイドラインにより受け入れやすくなるかもしれません。楽しい一日を。
ワールドエンジニア

@WorldEngineer他の言語では、時間厳守の5つの質問に対する回答のほとんどは、1行または数行で指定できます。残念ながら、5つの質問すべてを分けて1つずつ質問することはできません。これは許可されますか?
Eduard Florinescu 2012

1
一度に1つの質問をしてください。その後さらに質問がある場合は、個別のリンクされた質問として質問してください。
ChrisF

1
@WorldEngineer質問を1つだけになるように編集しました
Eduard Florinescu、

1
ところで、古典的な継承が間違ったことの1つは、メソッドとプロパティを完全に分離することです。Neumannアーキテクチャマシン(ARM、PowerPC、Intel)では、意味がありません。これはJSがうまくやっていることです。そして、これらはproto-oopがどのように機能するかを示す非常に良い質問でした。
Aadaam 2012

回答:


6

オブジェクトを継承するにはどうすればよいですか?

function inherit(o){ // inherit is called Object.create in modern implementations
    var F= function(){};
    F.prototype=o;
    return new F();
}

var parent = {
    name: "Josh",
    print: function(){
       console.log("Hello, "+this.name);
    }
};
parent.print(); // Hello, Josh
var child = inherit(parent);
child.name = "Jeremy";
parent.print(); //Hello, Josh
child.print();  //Hello, Jeremy

どうすれば親の財産を見ることができますか?

console.log(child.__proto__.name); //won't work in IE; also see getPrototypeOf

どうすれば親の機能にアクセスできますか?

Object.getPrototyepeOf(child).print(); // or
child.print.apply(parent) //functions are just objects, and 'this' pointer can point to wherever you want

どうすれば親の関数を上書きできますか?

child.print = function(){
    console.log("Hi ", this.name);
}

parent.print(); //Hello, Josh
child.print();  //Hi, Jeremy

オブジェクトは2つのオブジェクトをどのように継承できますか?

//in chain?

grandchild = inherit(child);

//otherwise, there's no way.
grandchild.name = "Eddie";
grandchild.print();

こちらもご覧ください:


関数Fには{}がなく、オブジェクトには、(カンマ)ではなく;(セミコロン)があったため、編集しました。コンソールでエラーが発生しなくなりました。それは機能し、なぜ今それがとても簡単に見えるのか分かりません。私の同僚の1人も良い部品を持っていますが、この場合、あなたの例はさらに役に立ちました。ありがとう。
Eduard Florinescu 2012

2

陽気な専門家@venkat_sは、プロトタイプの継承を把握するためのアナロジーを共有しています。

彼のユーモアのサンプルは次のとおりです。「JavaScriptについてのことは、あなたに怒鳴りません。それはあなたの友達です。何かがうまくいかないときは通知せず、動作を停止します。あなたに電話をやめてください」

継承に関しては、彼は続けた、「プロトタイプはオブジェクトにとってバックパックのようなものです。オブジェクトであるJavaScriptのすべての場合、それにはバックパックがあり、それに物を置くことができます。すべてのオブジェクトがそれにアクセスできます。」

お役に立てば幸いです。


バックパックはプロトタイプだと思いますか?
Eduard Florinescu 2012

はい、簡潔さをお詫びします。彼はさらに、多重継承への類推を拡張しました-「それはバックパックと財布を持っているようなものです。」、「それぞれに物を入れるだけです。」、「プロトタイプ継承のエラーは時々それが...あなたの財布、そしてあなたはそれを取り戻す必要があります。」これはあなたが直面するかもしれない課題ですが、解決すべき基本的なooデザインパターンです。
ジャックストーン

2

コードを忘れます。最も簡単な説明。

関数コンストラクターはオブジェクトを作成します。JSでは、関数はそれ自体がプロパティを持つことができるオブジェクトです。すべての関数には、任意のオブジェクトを含むことができるプロトタイププロパティがあります。コンストラクタのプロトタイプをその場で簡単に設定できます。たとえば、配列を台無しにしたい場合は、

Array.prototype = {
    oneTrueMethodToRuleThemAll: function(){
        alert('arrays are now hosed');
    }
}

プロトタイプオブジェクトは、基本的には、持っていないプロパティを参照しようとしたときにインスタンスによってチェックされるフォールバックです。プロトタイプオブジェクトにそのメソッドがない場合、そのコンストラクターのプロトタイプオブジェクトがメソッドをチェックされます。それは従われる鎖です。

だから、それは本当に継承についてではありません。それは、「ああ、あなたはそれを持っていない、お母さんはそれをプロトタイプのバッグに入れていますか?いいえ?彼女の祖母はどうですか?いいえ?次に、イブまたはオブジェクトコンストラクタのプロトタイプに到達するまではどうですか?ドルは常に停止する場所です。

したがって、インスタンスがプロトタイプの内容を取得または保持するわけではありません。JavaScriptがオブジェクトのメソッドを呼び出すときに、不明なメソッドが見つかるかどうかを確認するために、object-> constructor.prototypeチェーンをチェックするフォールバックプロセスがあるだけです。そのため、コンストラクタプロトタイプを変更すると、既存のすべてのインスタンスがそのメソッドを「取得」します。彼らは本当に何も得ません。新しいメソッドを取得するのは、ルックアップ用のオブジェクトのフォールバックセットです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.