<script> function p(){var len = arguments.length; for(var i = 0; i <len; i ++){document.write(arguments [i]+"<br/>"); }} function myclass(x、y){this.x = x; this.y = y; this.show = function(){return this.x+this.y; }} var m1 = new Myclass(1,2); var m2 = new Myclass(3,4); p(m1.show()、m2.show()); </script>既存の問題
1.すべてのインスタンスが同じ方法で定義されたエンティティをコピーするため、効率(メモリ効率と非効率的な実行)はプロトタイプの継承を通じて解決できます。
2。属性値の制御にアクセスできません(プライベート、パブリック)は、閉鎖によって解決できます
属性によってアクセスされる操作オブジェクトは変数ではなく、オブジェクトへの参照です
数値の整数部品のみの読み取りの処理
数学[this <0? 'celling': 'floor'](this);
連想配列
JSでは、連想配列を実装するためにオブジェクトを渡す必要があります
基本操作は、キー、要素の設定、要素の削除によって行われます。
<script> var map = {x:3、y:4}; p(map.x);削除map.x; //truep(map.x); //未定義の存在しない要素へのアクセスの結果は未定義です。値は未定義に設定できるため、値を未定義と比較することで値が存在するかどうかを判断することは不可能です。 a = 'undefined'; p(a); // undefinedp(typeof map.x == a)in for for for for // true </script>連想配列として、注意する必要があります
<script>関数myclass(x、y){this.x = x; this.y = y;} myclass.prototype.z = 5; var obj = new Myclass(1,2); for(bar key in obj){p(key+":"+obj [key]); //プロトタイプを介して継承される属性は列挙されます} // x:1 y:2 z:5delete obj.x; // truep(obj.x); //undefinedp(obj.z); // 5 //プロトタイプを介して継承された属性を削除できませんobj.zを削除しません。 //truep(obj.z);//5//は、オブジェクトを連想配列として使用して、通常、リテラルが作成されます。ビューがリテラルの空のオブジェクトを使用して要素のない連想配列を作成したとしても、プロトタイプの属性P(objの「toString」)。 // truevar obj1 = {}; p(obj1の 'tostring'); // true // enumenp(obj1.length); // undefinedfor(obj1のvar k){p(obj1 [k]);} //要素は列挙されていません。これは、列挙可能な属性のためです。//truevarobj1 = {}; p(obj1の 'tostring'); // true // p(obj1.length) // undefinedfor(obj1のvar k){p(obj1 [k]);} //要素は列挙されていません。これは、列挙可能な属性のためです。//truevarobj1 = {}; p(obj1の 'tostring'); //FALSEMAP ['TOSTRING'] = 1; p(map.hasownProperty('tostring '))); // truedelete Map ['tostring']; p(map.hasownproperty( 'tostring')); // false </script>属性
オブジェクトの属性には、いくつかの属性もあります
次の表は、ECMAScriptの第5版で定義された属性をまとめたもので、属性値は値属性として定義されています。
表1
属性名 | 意味 |
書き込み可能 | 属性の値を書き直すことができます |
列挙可能 | inで列挙することができます |
設定可能 | 属性を変更して属性を削除できます |
得る | プロパティ値を指定するゲッター関数 |
セット | 属性値を指定できるセッター関数 |
不変のオブジェクト
つまり、世代後に状態を変更できないオブジェクトであり、文字列オブジェクトは典型的な不変のオブジェクトです。
不変のオブジェクトを柔軟に使用すると、メソッドパラメーターに渡すときなど、プログラムの堅牢性を改善できます。オブジェクトコンテンツなどを書き換える方法があります。
不変のオブジェクトはJSに実装できます
1.属性(ステータス非表示)を非表示にし、変更操作(閉鎖実装)を提供しない
2。第5版でECMAScriptが提供する機能の柔軟な使用
3.書き込み可能な構成可能な属性、セッター、ゲッターの柔軟な使用
ECMaScriptバージョン5の不変のオブジェクトをサポートするために使用される機能を次の表に示します
メソッド名 | 新しい属性 | 属性削除 | 属性値の変更 | 確認方法 |
PrevestExtensions | x | o | o | object.isextensible |
シール | x | x | o | object.issaled |
フリーズ | x | x | x | object.isfrozen |
object.preventextensionsの例
<script> var obj = {x:2、y:3}; object.preventextensions(obj); //属性obj.z = 4; p(object.keys(obj)); // x、y //属性obj.y; p(object.keys(obj)); // x //属性値を追加できませんobj.x = 20; p(obj.x); //20//object.Sealの例FALSE var obj = {x:2、y:3}; object.seal(obj); // obj.z = 3; p(object.keys(obj))を追加または削除することはできません。 // x、ydelete obj.x; //falsep(object.keys(obj));//x,//can属性値を変更するobj.x = 20; p(obj.x); // 20 // object.freezeの例属性の書き込みをfalse obj = {x:2、y:3}; object.freeze(obj); obj.z = 3; p(object.keys(obj)); // x、y //属性値を変更できますobj.x = 20; p(obj.x); // 20 </script>注意を払う必要があります
1.上記の3つの方法については、変更されると復元できません。
2.プロトタイプの継承の継承方法を変更せずにしたい場合は、表示する必要があります。