[セットトップ]JavaScriptオブジェクト、関数(あなたが知らないJavaScript)


一、対象
var obj = {};
obj[true] = "foo";
obj[3] = "bar";
obj[obj] = "baz";

obj["true"];
obj["3"];
obj["[object Object]"];
二、配列も対象です.
var ary = ["foo", 42, "bar"];
ary.baz = "baz";
ary.length;	//3
ary.baz;

/*              ,     “   ”     ,             */
ary["4"] = "baz";	
ary.length;	//5
ary[4];
三、オブジェクトの属性
writable:書き込み可能(修正)enumerable:エニュメレーション可能(for...in)configrable:設定可能(配置、削除)注意:deleteはオブジェクト(削除可能)属性のみ削除可能、すなわちconfigrableはtrueの属性です.
var obj = {};
Object.defineProperty(obj, "a", {enumerable:true, value:2});
Object.defineProperty(obj, "b", {enumerable:false, value:3});

/*                  (        )   enumerable:true */
obj.propertyIsEnumerable("a");	//true
obj.propertyIsEnumerable("b");	//false

/*       ,    (  )      */
Object.keys(obj);	//["a"]
/*       ,    (  )   */
Object.getOwnPropertyNames(obj);	//["a", "b"]
注意:inとhasOwnProperty(.)の違いは、[Prottype]チェーンを検索するかどうかですが、Object.keys(.)とObject.getOwn PropertyNames(.)は、オブジェクトが直接含まれる属性のみを検索します.
四、対象の原型
オブジェクトの原型を取得:Object.get ProptyOf(.)
function Foo(){}
var foo = new Foo();
Foo.prototype === Object.getPrototypeOf(foo);	//true
注意:類に向かっている言語では、何度も種類を複製(実用化)して、金型でものを作るようにしています.JavaScriptには、類似のコピーメカニズムがありません.クラスの複数のインスタンスを作成できません.複数のオブジェクトしか作成できません.それらは同じオブジェクトに関連付けられています.これは、依頼されたオブジェクトの属性と方法を利用することができます.
クラス理論:構造が完了した後、通常はクラスではなく、これらのインスタンスを操作するだけで、すべてのインスタンスにタスクを完了する必要があるすべての行動があるからです.
五、プロトタイプチェーン[プロトタイプ]
[prototype]とは、オブジェクト内に存在する内部リンクのことで、他のオブジェクトを参照します.
var foo = {
	something:function(){
		// ....
	}
};
var bar = Object.create(foo);	//      bar,        foo 。
Object.reate(null)は、空のリンクを持つオブジェクトを作成します.このオブジェクトは委託できません.プロトタイプチェーンが存在しないので、instance ofは常にfalseに戻ります.プロトタイプチェーンに邪魔されず、データを保存するのに最適です.
相手との関係はコピーではなく依頼!!
プロトタイプチェーンについては、JavaScriptの中でよくあるタイプの検査に触れなければなりません.すなわち内省:検査例の種類.主な目的は、作成方式によりオブジェクトの構造と機能を判断することである.
方式一:a instance of Foo
方式二:
アヒルのタイプ:アヒルのように見えるなら、アヒルのように鳴けば、きっとアヒルです.
if(a.something) {
	a.something();	// something()     a   
}
方式三:isProttypeOf()、get ProttypeOf()
使い方を提案します.
六、関数
JavaScriptの関数は本当にコピーできないので、関数オブジェクトの参照は共有できます.これは、共有関数を変更すると、属性を追加するなど、すべての参照箇所が同時に修正されるという意味です.
七、コンストラクタ
function Foo(){}
Foo.prototype = {};

var a1 = new Foo();
a1.constructor === Foo;		//false
a1.constructor === Object;	//true
詳細:
新しいオブジェクトを作成し、関数のデフォルトのプロトタイプオブジェクトの参照を置き換えると、新しいオブジェクトは自動的に得られません.
a 1には.constructor属性がないので、[Prottype]チェーンのFoo.prototypeを依頼します.ただし、この対象はありません.construct属性ですので、チェーン先端のObject.protoypeに任せ続けます.
実際には、オブジェクトのconstructorはデフォルトで関数を指します.この関数はオブジェクトのprototypeを通じて参照できます.
つまり、コントローラーは構造を表示されていない!!prototypeを変えることは、継承関係を徹底的に変えることはできません!!!
function Foo(name){
	this.name = "FenFei"
}
function Bar(){}
誤った理解一:
Bar.prototype = Foo.prototype;
Bar.prototype.myTest = 123;
new Foo().myTest;	//123
は、Foo.prototypeオブジェクトを直接参照するBar.prototypeに関連する新しいオブジェクトを作成しません.Bar.prototype.myTest=123のような割当文を実行すると、Foo.prototypeオブジェクト自体が直接修正されます.
エラー理解二:
Bar.prototype = new Foo();
new Bar("Camile").name;	//FenFei
は確かにBar.prototypeに関連する新しいオブジェクトを作成します.しかし、Foo()の「構造関数呼び出し」を使用しており、Fooに副作用がある場合(他のオブジェクトに登録したり、thisにデータ属性を追加したりなど)は、Bar()の子孫に影響を与えます.
正確な処理方法一[ES 6前]:
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.myTest = 123;
new Foo().myTest;	//undefined
new Bar("Camile").name;	//undefined
正確な処理方法二[ES 6以降]:
Object.setPrototypeOf(Bar.prototype, Foo.prototype);
Bar.prototype.myTest = 123;
new Foo().myTest;	//undefined
new Bar("Camile").name;	//undefined
八、関数関係
(1)aの全項[prototype]チェーンにFoo.prototypeを指す対象がありますか?
a instanceof Foo;
(2)aの全体の条の[prototype]チェーンの中でFoo.prototypeが現れたことがありますか?
Foo.prototype.isPrototypeOf(a);	//          Foo,  prototype       。
(3)違います.
isPrototypeOf()メソッドは、オブジェクト間の関係を判断することができます.
b cの[prototype]チェーンに現れていますか?
b.isPrototypeOf(c);
例:
function Foo(){}
var a = new Foo();
console.log(a instanceof Foo);		// true
console.log(Foo.prototype.isPrototypeOf(a));	// true
var b = {};
var c = Object.create(b);
console.log(b.isPrototypeOf(c));	// true
console.log(b instanceof c);		// TypeError
従来のクラス指向の言語では、クラス定義はその後変更されないので、クラスのデザインは修正をサポートしていません.しかし、JavaScriptの最も強力な特性の一つはその動態性であり、どのオブジェクトの定義も修正できます.
【転載は出典を明記してください.http://blog.csdn.net/ligang2585116」