javascriptは対象に向かって設計します.

5813 ワード

オブジェクトは、「無秩序属性のセットは、基本値、オブジェクトまたは関数を含むことができます.」と定義できます.厳密には、オブジェクトは特定の順序がないグループの値に相当します.オブジェクトの属性や方法には名前がありますが、名前ごとに値が表示されます.
カスタムオブジェクトを作成する最も簡単な方法は、Objectのインスタンスを作成し、属性と方法を追加することです.
var person=new Object()
person.name=「Nichollas」
person.age=29
person.job=「Software Engineer」
person.sayName=function(){
consolie.log(this.name);
)
上記の例では、personというオブジェクトを作成し、3つの属性(name、age、job)と方法(sayName()を追加しました.ここでsayName()方法は、this.name(person.nameとして解析される)の値を表示するために使用される.その後、オブジェクトの字面量は、このようなオブジェクトを作成するための優先モードとなります.
var person={
name:「Nichollas」
age:29、
job:「Software Egineer」、
sayName:function(){
consolie.log(this.name);
)

この例のpersonオブジェクトは前の例のpersonオブジェクトと同じで、同じ属性と方法があります.これらの属性は作成時にいくつかの特徴値を持ち、JavaScriptはこれらの特徴値によってそれらの挙動を定義します.
一、属性のタイプ
ECMAScriptには2つの属性が含まれています.データ属性とアクセス属性です.
1.データのプロパティ
データ属性には、データ値の位置が含まれます.この位置では値の読み書きができます.データ属性には、その挙動を記述する4つの特性がある.
①[[ Configrable]:プロパティをdeleteで削除して属性を再定義することができるか、属性の特性を変更することができるか、またはアクセス属性に属性を変更することができるかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
②[[ Enumerable]:for-i nループで属性に戻れるかどうかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
③[[ Writable]:属性を変更できるかどうかを示す値です.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
④[[ Value]:この数字から与えられたデータ値を含みます.属性値を読み込むときは、この位置から読み、属性値を書き込むときは、新しい値をこの位置に保存します.この特性のデフォルト値はundefinedです.
前の例のように直接対象に定義された属性については、それらの[Configrable]、[Enumerable]、および[Writable]の特性がtrueに設定され、[Value]の特性が指定された値に設定されている.
属性のデフォルトの特性を変更するには、ECMAScript 5のObject.defineProperty()メソッドを使用する必要があります.この方法は、属性があるオブジェクト、属性の名前、および記述子オブジェクトの3つのパラメータを受信する.なお、記述子オブジェクトの属性は、configrable、enumerable、writable、valueでなければならない.1つ以上の値を設定すると、対応する特性値を変更できます.
var person={}
Object.defineProperty(person)「name」
writable:false、
value:「Nichollas」

consone.log(person.name);
person.name="Greg"
consone.log(person.name);
この例では、nameという属性が作成され、その値は「Nichollas」で読み取り専用です.この属性の値は変更できません.新しい値を指定しようとするなら、非厳格モードで江北無視を実行します.厳格なモードでは、値付け操作はエラーの原因となります.
同様のルールは、設定不可能な属性にも適用されます.以下のとおりです
var person={}
Object.defineProperty(person)「name」
configrable:false、
value:「Nichollas」

consone.log(person.name);
delete person.name;
consone.log(person.name);
configrableをfalseに設定し、オブジェクトから属性を削除できないことを示します.この属性に対してdeleteを呼び出すと、非厳格モードでは何も起こらず、厳格モードではエラーが発生します.また、属性を設定不可と定義したら、設定可能に変更することはできません.この場合、Object.defineProperty()メソッドを呼び出して、writable以外の特性を修正すると、エラーが発生します.
var person={}
Object.defineProperty(person)「name」
configrable:false、
value:「Nichollas」

//エラーの投げ方
Object.defineProperty(person)「name」
configrable:true、
value:「Nichollas」

つまり、Object.definePropertyを何度も呼び出して、同じ属性を修正することができますが、configrableの特性をfalseに設定すると制限があります.
2.アクセス器のプロパティ
アクセス属性にはデータ値が含まれていません.それらは一対の子供ゲッターとセッター関数を含んでいます.アクセス属性を読み込むと、getter関数が呼び出されます.この関数は有効な値を返します.アクセス属性を書き込みすると、setter関数を呼び出して新しい値を入力します.この関数はデータの処理方法を決定します.アクセス器のプロパティは以下の4つの特性があります.
①[[ Configrable]:プロパティをdeleteで削除して属性を再定義することができるか、属性の特性を変更することができるか、またはアクセス属性に属性を変更することができるかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
②[[ Enumerable]:for-i nループで属性に戻れるかどうかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
③[[ Get]:プロパティの読み込み時に呼び出す関数です.デフォルトはundefinedです.
④[[ Set]:属性の書き込み時に呼び出す関数です.デフォルトはundefinedです.
アクセス器のプロパティは直接定義できません.Object.defineProperty()を使用して定義しなければなりません.以下の例:
var book={
_year:2004、
エディション:1

Object.defineProperty(book,「year」,{
get:function(){
return this.year;
}
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
)
)

book.year=2005;
consolie.log(book.edition);
以上のコードはbookオブジェクトを作成し、二つのデフォルトの属性を定義します.yearとエディション._yearの前の下線は、対象方法だけでアクセスできる属性を示すためによく使われている記号です.アクセサ属性yearはgetter関数とsetter関数が含まれています.getter関数は_に戻りますyearの値、setter関数は計算によって正確なバージョンを決定します.ですから、year属性を2005に変更すると、_を招きます.yearは2005になり、editionは2になります.これはアクセサ属性を使用する一般的な方法で、属性の値を設定すると他の属性が変化します.
必ずしもゲッターとセッターを同時に指定しなくてもいいです.getterを指定するだけでは、属性は書き込めないことを意味し、書き込み属性は無視されます.厳密なモードでは、書き込みを試みてゲッター関数のみを指定した属性はエラーを投げます.同様に、setter関数のみの属性を指定しても読めません.そうでないと、非厳格モードでundefinedに戻ります.厳格なモードではエラーが発生します.
二、複数の属性を定義する
Object.defineProperties()の方法を利用して、説明符によって一度に複数の属性を定義することができます.この方法は2つのオブジェクトのパラメータを受け入れます.最初のオブジェクトは属性を追加して変更するオブジェクトで、2番目のオブジェクトの属性は最初のオブジェクトに追加または変更する属性にそれぞれ対応します.たとえば:
var book={}
Object.defineProperties(book,{
_year:{
value:2004
}
エディション:{
value:1
}
year:{
get:function(){
return this.year;
}
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
)
)
)

以上のコードは、bookオブジェクト上で2つのデータ属性(au yearとedition)と1つのアクセス属性を定義しています.ここの属性は同じ時間に作成されます.
三、属性の特性を読み取る
ECMAScript 5のObject.getOwn PropertyDescriptor()方法を使用して、与えられた属性の記述子を取得することができます.この方法は、属性があるオブジェクトとそのディスクリプタの属性名を読み出す2つのパラメータを受信します.戻り値はオブジェクトです.アクセス属性であれば、このオブジェクトの属性はconfigurble、enumerable、get、setがあります.データ属性であれば、この対象の属性はconfigrable、enumrable、writable、valueがあります.たとえば:
var book={};
Object.defineProperties(book,{
_year:{
value:2004
},
edition:{
value:1
},
year:{
get:function () {
return this._year;
},
set:function (newValue) {
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
}
});
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");
console.log(descriptor.value);
console.log(descriptor.configurable);
console.log(descriptor);
 
転載先:https://www.cnblogs.com/yjingjing/p/7028189.html