web-dev-qa-db-ja.com

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

Javascript:The Good Partsを読んでいて、prototypes

少しグーグルの後、私はそれがオブジェクト宣言にプロパティを追加することであるという結論に達しました後でオブジェクト宣言。

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);

10
Mild Fuzz

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

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

例:

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"

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

13
Raynos

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

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

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

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

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

7
adivasile

この記事 をご覧ください。

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

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

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

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

5
Jose Faeti