プロトタイプ方式のポイントは何ですか?


10

私はJavascript:The Good Partsを読んでおり、プロトタイプに関するセクションを理解するのに苦労しまし

少しグーグルで調べたところ、オブジェクト宣言のにオブジェクトにプロパティを追加するという結論に達しました。

w3schoolsからきらめくこのスクリプトを使用して、プロトタイププロパティを追加する行を削除しても効果ないことに気付きました。だからポイントは何ですか?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write(fred.salary);


4
@Raynosはよく言っていますが、MDNのドキュメントなど、代わりのものも提案しています:developer.mozilla.org/en/JavaScript
StuperUser

回答:


13

それはプロトタイプが機能する方法ではありません。プロトタイプはプロトタイプチェーンで使用されます。

オブジェクトのプロパティを取得しようとすると、オブジェクトのプロパティ名がチェックされます。存在しない場合は、プロトタイプを調べます。

例:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

したがって、プロトタイプのポイントは、単純にコードの再利用と継承です。


わかりましたので、今これを取得します。しかし、私は動的にプロパティを追加しようとしました、そしてそれは私に教えてくれますprototype is undefined---o.prototype.newProp = "mutts nuts";
穏やかなファズ

3
@MildFuzz oはオブジェクトです。.prototypeプロパティは、それを無視し、機能に使用されています。ただやるo.newProp = "mutts nuts"
レイノス

7

あなたがしたとき、あなたはfred.salary=20000給与属性をフレッドのみに追加しました。プロトタイプを使用する場合、それ以降に作成するすべての従業員はsalary属性を持ちます。

従業員のインスタンスが100個あり、そのすべてに給与属性を追加したいとします。手動でそれを行い、各従業員を反復処理して追加できます。または、すべてのプロトタイプとセットを使用できます。

プロトタイプは、既存の機能を使用したい場合に役立ちます。配列にカスタムメソッドを追加するとします。あなたは次のようなことをするでしょう:

Array.prototype.my_custom_method = function() {...}

以降、作成するすべてのアレイで、そのメソッドを使用できるようになります。


3
これがメモリ使用量を抑えるように設計されていると誰も言っていないことに私は驚いています。大量のコードを持つ複雑なオブジェクトを実装する必要がある場合、オブジェクトのすべてのインスタンスでコードが繰り返されるのは望ましくありません。明らかに、データプロパティはインスタンスごとに異なる可能性が高くなりますが、通常はコードのコピーが1つだけ必要なので、プロトタイプに入れます。
Dominic Cronin 2012

1
IMOこれは断然最高の答えです。
マフィンマン

5

あなたは見て撮りたいことがあり、この記事を

プロトタイプベースの言語には、プロトタイプオブジェクトという概念があります。これは、新しいオブジェクトの初期プロパティを取得するためのテンプレートとして使用されるオブジェクトです。オブジェクトは、作成時または実行時に、独自のプロパティを指定できます。さらに、任意のオブジェクトを別のオブジェクトのプロトタイプとして関連付けることができるため、2番目のオブジェクトが最初のオブジェクトのプロパティを共有できます。

オブジェクトのセットのプロトタイプとして使用されるオブジェクトにプロパティを追加すると、それがプロトタイプであるオブジェクトも新しいプロパティを取得します。

これは、クラスベースの言語よりもプロトタイプベースの言語の主な利点の1つです。

また、必要に応じてJSで従来のOO継承を取得するのは簡単ですが、デフォルトで実装されていない言語のプロトタイプモデルを取得するのは難しい場合がよくあります。


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