- new Object();
- {}
- Object.create();
- 工場モデル
- コンストラクタ・モデル
- 試作モデル
- コンストラクタとプロトタイプの組み合わせパターン
- ダイナミック・プロトタイプ・パターン
new Object() {}
- オブジェクトとして __proto__ を持つオブジェクトを作成します;
Object.create()
- パラメータが NULL または何もない場合、空のオブジェクトが作成され、暗黙のプロトタイプは存在せず、toString メソッドの呼び出しもエラーを報告します;
- 引数はプロトタイプ・オブジェクトで、 __proto___ がこのプロトタイプを指していることを示します;
工場モデル
function Person() {
 var o = new Object();
 o.name = 'hanmeimei';
 o.say = function() {
 alert(this.name);
 }
 return o;
}
var person1 = Person();
長所:オブジェクトに対するリクエストを作成
短所
- コンストラクタでオブジェクトを識別できません。オブジェクトはすべてObjectから来たものだと思っていたのですが、Personから来たものかどうかはわかりません;
- Personを使ってオブジェクトを作成するたびに、すべてのメソッドは同じですが、何度も保存されるため、コンピュータのリソースを浪費します;
コンストラクタ・モデル
function Person() {
 this.name = 'hanmeimei';
 this.say = function() {
 alert(this.name)
 }
}
var person1 = new Person();
長所
- オブジェクトのインスタンスのクラスは、コンストラクタまたは instanceof
- オブジェクト・インスタンスは new キーワードで作成できます;
短所
- 複数のインスタンスを作成する方法は変わりませんが、複数のオブジェクトを作成する際に何度も保存することでコンピュータのリソースを浪費してしまうという問題は未解決のままです;
試作モデル
function Person() {}
Person.prototype.name = 'hanmeimei';
Person.prototype.say = function() {
 alert(this.name);
}
Person.prototype.friends = ['lilei'];
var person1 = new Person();
長所
- 共有のためのメソッドが実装されています;
- プロトタイプ・オブジェクトにメソッドやプロパティを動的に追加することができます。
短所
- 参照型の場合、すべてのオブジェクト・インスタンスは同じアドレスを指し、その参照型のペアを変更すると、他のインスタンスも変更されます;
コンストラクタとプロトタイプの組み合わせパターン
function Person(name) {
 this.name = name
 this.friends = ['lilei']
}
Person.prototype.say = function() {
 console.log(this.name)
}
var person1 = new Person('hanmeimei')
person1.say() //hanmeimei
長所
- 参照型に対するプロトタイプ・パターンの欠点に対処;
- prototypeパターンにはパラメータを渡す手段がないという欠点を解決します;
- コンストラクタ・パターンがメソッドを共有できないという欠点に対処します;
短所:自由に追加してください;
ダイナミック・プロトタイプ・パターン
function Person(name) {
 this.name = name
 if(typeof this.say != 'function') {
 Person.prototype.say = function(
 alert(this.name)
 }
}
長所
- 共有メソッドをコンストラクタにカプセル化します;
- コンストラクターを最初に呼び出した時点で、プロトタイプ・オブジェクトの変更を完了させることが可能です;