JavaScript言語の精粋対象(検索、プロトタイプ)


醜いものは目を閉じて無視する.
JavaScriptのオブジェクトは可変のキーセットオブジェクトであり、各属性は名前と値を持っている.属性の名前は文字列を含む任意の文字列とすることができ、属性値はundefined値以外の任意の値であることができます.JavaScriptのオブジェクトはカテゴリなしで、新しい属性の名前と値に制約がありません.オブジェクトはデータの収集と管理に適しています.オブジェクトは他のオブジェクトを含むことができますので、ツリーまたはグラフィックス構造として容易に表現できます.JavaScriptは、オブジェクトが他のオブジェクトの属性を継承することができるプロトタイプチェーン特性を含みます.正確に使うと、オブジェクト初期化の時間とメモリの消費を減らすことができます.
オブジェクト検索
var empty_object = {};
var stooge = {
	"first-name":"Ouyang",
	"last-name":"ping",
	"yyl":"yyl"
}
alert(stooge["first-name"]); //Ouyang
alert(stooge.first-name);//NaN
alert(stooge.yyl)//yyl
alert(stooge.name);//undefined
|𞓜演算子は標準値を満たすために使用できます.
var middle = stooge["middle-name"] ||"none";

flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model //undefined
原型
オブジェクトタイプの原型の参照を返します.Object Name.prototype object Nameパラメータは、オブジェクトの名前の原型が更新時に接続されていません.オブジェクトを変更すると、そのオブジェクトのプロトタイプには触れません.プロトタイプ接続は検索値の時にのみ使用されます.オブジェクトの属性を取得しようとすると、そのオブジェクトにはこの属性がありません.JavaScriptはプロトタイプのオブジェクトから属性値を取得してみます.もしそのプロトタイプの対象も該当属性がないなら、そのプロトタイプから順に類推して、その過程が最終的に終点Object.prototypeに到達するまで、欲しい属性が全くプロトタイプチェーンに存在しないなら、結果はundefied値となります.
function TestObjectA() 
{ 
    this.MethodA = function() 
    { 
       alert('TestObjectA.MethodA()'); 
    } 
} 

function TestObjectB() 
{ 
	this.bb = 'ccc';
    this.MethodB = function() 
    { 
       alert('TestObjectB.MethodB()'); 
    } 
} 

TestObjectB.prototype = new TestObjectA(); //TestObjectB    TestObjectA   

TestObjectB.prototype.bb = 'aaaaa'; //    
var temp
var b = new TestObjectB();
for (temp in b) {
  alert(temp); // MethodA  bb MehtedB
}
var kk = new TestObjectB();
//  ,          
alert(kk.bb); // ccc
delete kk.bb;
alert(kk.bb); // aaaa

alert(kk.MethodA()); //TestObjectA.MethodA()
ここで転載するhttp://fengsky491.iteye.com/blog/228583 ありがとうございます
JScriptの中のprototypeは、なぜ私たちがプロtype patternの中のプロトタイプと違っていると言っていますか?これは私が言ったのではなく、私が吹いたのでもありません.この例を見てください. 

 <script language="javascript">
function RP() 
{ 
    RP.PropertyA = 1; 
    RP.MethodA = function() 
    { 
         alert("RP.MethodA "); 
    }; 
    
    this.PropertyA = 100; 
    this.MethodA = function() 
    { 
         alert("this.MethodA"); 
    }; 
} 

RP.prototype.PropertyA = 10; 
RP.prototype.MethodA = function() 
{ 
    alert("RP.prototype.MethodA"); 
}; 
</script> 
  
焦らないでください.まだサンプルを作っていません.私たちが見せてくれるクラスだけです.RPは何ですか?rpwtですか?もちろん違います.RPはReearch Prottypeです.いいです.例と結果を見て分析します.  
<script language="javascript"> 
rp = new RP(); 
alert(RP.PropertyA); 
RP.MethodA(); 
alert(rp.PropertyA); 
rp.MethodA(); 
</script> 
            : 
   1 
   RP.MethodA 
   100 
   this.MethodA 
      %$@#^$%&^...,    ,    ! 
<script language="javascript"> 
rp = new RP(); 
delete RP.PropertyA; 
alert(RP.PropertyA); 
delete RP.MethodA; 
RP.MethodA(); 
delete rp.PropertyA; 
alert(rp.PropertyA); 
delete rp.MethodA; 
rp.MethodA(); 
</script> 
            : 
   undefined 
   A Runtime Error has occurred. 
   Do you wish to Debug? 
   Line: 32 
   Error: Object doesn't support this property or method 
   10 
   RP.prototype.MethodA 
   
面白いでしょう.何かいいところがありますか?ここのRP.PropertyAとRP.MethodAは参照用だけですが、this.PropertyAとthis.MethodAはどのようにdeleteされていますか?結果を出すことができます.また、prototypeに導入された属性と方法ですか?    これはJScriptのprototypeとprototype patternの中のprototypeの最大の違いです.JScriptの中のこのいわゆるprototype属性は実は言語自体が支持する特性です.ここでは何のcopyも発生していません.showもdeepもありません.JScriptの解釈エンジンについては、「.」または「keyName」で参照されたオブジェクトの属性と方法を処理する際に、まずオブジェクト自体のインスタンス(this)で検索し、見つけたら戻りますか?それとも実行します.検索対象のプロトタイプに検索対象のオブジェクトと方法が定義されていますか?見つけたら戻りますか?それとも実行します.検索されなかったらundefinedまたはruntime errorに戻ります.    プロトタイプがクラスのインスタンスを導入する属性または方法が動的に検索されているからこそ、Stringオブジェクトにtrimメソッドを追加するなど、システム内のオブジェクトにプロトタイプ属性と方法を追加することができます.
<script lanuage="javascript"> 
String.prototype.trim() 
{ 
    return this.replace(/(^\s+)|(\s+$)/g, ""); 
} 
</scritp> 
 
 
明らかにJScriptの中のこのような用法もprototype patternの中のprototypeが解釈して支持することができないのです.    これはJScript OOPにおける原型継承法の理解には何の障害もないでしょう.同時に、なぜ原型継承法がそんなに大きな欠陥を持っているのかが分かりますよね?もちろん何か問題がありましたら、引き続き検討してください.
反射
オブジェクトを確認し、属性がどのようなものかを確認するのは簡単です.属性を検索して取得した値を検証してみると、typeofオペレータは属性の種類を確定するのに役立ちます.
typeof flight.number
もう一つの方法はハスOwnProperty方法を使用して、対象が独自の属性を持っているなら、true.hasOwnProperty方法に戻ります.原型接続は確認されません.
flight.hasOwnProperty('nubmer');
列挙(オブジェクトの属性)
for inステートメントは、オブジェクト内のすべての属性名を巡回するために使用できます.このエニュメレート・プロセスは、すべての属性を列挙します.
関数とあなたが関心がないかもしれないプロトタイプの属性を含めて、あなたが望まない値をフィルタリングする必要があります.最もよく使う
のフィルタはhasOwnProperty方法であり、typeofを使って関数を排除します.
var name;
for (name in another_stooge) {
	if (typeof another_stooge[name] != 'function') {
		document.writeln(name+':'+another_stooge[name]);
	}
}
属性名の出現順序は不確定です.したがって、可能な順序を準備します.属性を特定の順序で確保するには、for in文を完全に使用しないで、正しい順で属性名を含む配列を作成するのが一番いいです.
var i ;
var properties = [
	'first-name',
	'middle-name',
	'last-name',
	'profession'
];
for (i = 0 ; i < properties.length; i += 1) {
	document.writeln(properties[i]+':'+another_stooge[properties[i]]);
}
forを使うことによって、for inではなくて、私達の欲しい属性を得ることができます.原型チェーンの中の属性を発掘することができることを心配しないでください.そして私達は正しい順番でその値を取得しました.