javascriptは対象プログラムに向かって設計します.
9093 ワード
javascriptでは、各オブジェクトは一つの参照タイプに基づいて作成されています.ECMAScriptのオブジェクトは分散リストとして想像できます.名前のペアに過ぎません.その中の値はデータや関数でもいいです.
対象を深く理解する
カスタムオブジェクトを作成する最も簡単な方法は、Objectのインスタンスを作成し、属性と方法を追加します.以下の通りです.
ECMAScriptには、データ属性とアクセス属性の2つがあります.1、データ属性データ属性は、データ値の位置を含みます.この位置では値の読み書きができます.データ属性には、その挙動を記述する4つの特性がある.[[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、またはアクセス器の属性に属性を変更することができますか?前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
[[Enumerable]:for-iを循環して属性に戻れるかどうかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
[[Writable]]:属性を変更できるかどうかを示す値.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
この属性を含むデータの値.属性値を読み込むときは、この位置から読みます.属性値を書き込むときは、新しい値をこの位置に保存します.この特性のデフォルト値はundefinedです.
前の例のように直接対象に定義された属性については、それらの[Configrable]、[Enumerable]、および[Writable]の特性がtrueに設定され、[Value]の特性が指定された値に設定されている.たとえば:
属性のデフォルトの特性を変更するには、ECMAScript 5のObject.defineProperty()メソッドを使用する必要があります.この方法は、属性があるオブジェクト、属性の名前、および記述子オブジェクトの3つのパラメータを受信する.このうち、記述子のオブジェクトの属性は、configurble、enumerable、writable、valueでなければならない.1つ以上の値を設定すると、対応する特性値を変更できます.たとえば:
同様のルールは、設定不可能な属性にも適用されます.たとえば:
Object.defineProperty()メソッドを呼び出した場合、configrable、enumerable、およびwritable特性のデフォルト値はfalseです.多くの場合、Object.defineProperty()方法が提供するこれらの高級機能を利用する必要がないかもしれない.しかし、これらの概念を理解することはJavaScriptオブジェクトを理解するために非常に有用である.
2.アクセス器のプロパティ
アクセス属性にはデータ値が含まれていません.それらは一対の子供ゲッターとセッター関数を含んでいます.アクセス属性を読み込むと、getter関数が呼び出されます.この関数は有効な値を返します.アクセス属性を書き込みすると、setter関数を呼び出して新しい値を入力します.この関数はデータの処理方法を決定します.アクセス器のプロパティは以下の4つの特性があります.
[[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、または属性をデータ属性に変更することができますか?オブジェクトに直接定義された属性に対して、この特性のデフォルト値はtrueです.
[[Enumerable]:for-iを循環して属性に戻れるかどうかを示します.オブジェクトに直接定義された属性に対して、この特性のデフォルト値はtrueです.
[[Get]:属性の読み込み時に呼び出す関数です.デフォルトはundefinedです.
[[Set]:属性を書き込む時に呼び出す関数です.デフォルトはundefinedです.
アクセス器のプロパティは直接定義できません.Object.defineProperty()を使用して定義しなければなりません.次の例を見てください.
3、属性の特性を読み取る
ECMAScript 5のObject.getOwn PropertyDescriptor()方法を使用して、与えられた属性の記述子を取得することができます.この方法は、属性があるオブジェクトとそのディスクリプタの属性名を読み出す2つのパラメータを受信します.戻り値はオブジェクトです.アクセス属性であれば、このオブジェクトの属性はconfigurble、enumerable、get、setがあります.データ属性であれば、この対象の属性はconfigrable、enumerable、writable、valueがあります.
アクセス属性yearに対して、valueはundefinedに等しく、enumerableはfalseであり、getはgetter関数を指すポインタである.
著作権声明:本文は小平果のオリジナル文章で、転載は明記してください.http://blog.csdn.net/i10630226
転載先:https://www.cnblogs.com/dingxiaoyue/p/4948232.html
対象を深く理解する
カスタムオブジェクトを作成する最も簡単な方法は、Objectのインスタンスを作成し、属性と方法を追加します.以下の通りです.
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
};
初期のJavaScript開発者はよくこのモードを使って新しいオブジェクトを作成します.数年後、対象の字面量はこのような対象を作る第一のパターンとなります.前の例は対象の字面量文法でこう書くことができます.var person = {
name: "Nicholas",
age: 29,
job: "Software Engineer",
sayName: function(){
alert(this.name);
}
};
属性の種類ECMAScriptには、データ属性とアクセス属性の2つがあります.1、データ属性データ属性は、データ値の位置を含みます.この位置では値の読み書きができます.データ属性には、その挙動を記述する4つの特性がある.[[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、またはアクセス器の属性に属性を変更することができますか?前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
[[Enumerable]:for-iを循環して属性に戻れるかどうかを示します.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
[[Writable]]:属性を変更できるかどうかを示す値.前の例のようにオブジェクトに直接定義された属性のデフォルト値はtrueです.
この属性を含むデータの値.属性値を読み込むときは、この位置から読みます.属性値を書き込むときは、新しい値をこの位置に保存します.この特性のデフォルト値はundefinedです.
前の例のように直接対象に定義された属性については、それらの[Configrable]、[Enumerable]、および[Writable]の特性がtrueに設定され、[Value]の特性が指定された値に設定されている.たとえば:
var person = {
name: "Nicholas"
};
ここでnameという属性を作成しました.これに指定された値は「Nichollas」です.つまり、「Value」特性は「Nichollas」に設定され、この値に対するいかなる修正もこの位置に反映されます.属性のデフォルトの特性を変更するには、ECMAScript 5のObject.defineProperty()メソッドを使用する必要があります.この方法は、属性があるオブジェクト、属性の名前、および記述子オブジェクトの3つのパラメータを受信する.このうち、記述子のオブジェクトの属性は、configurble、enumerable、writable、valueでなければならない.1つ以上の値を設定すると、対応する特性値を変更できます.たとえば:
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
この例はnameという属性を作成しました.その値は「Nichollas」が読み取り専用です.この属性の値は変更できません.新しい値を指定しようとしたら、非厳格モードでは、割り当ては無視されます.厳格なモードでは、値付け操作はエラーの原因となります.同様のルールは、設定不可能な属性にも適用されます.たとえば:
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
delete person.name;
alert(person.name); //"Nicholas"
configrableをfalseに設定し、オブジェクトから属性を削除できないことを示します.この属性に対してdeleteを呼び出すと、非厳格モードでは何も起こらず、厳格モードではエラーが発生します.また、属性を設定不可と定義したら、設定可能に変更することはできません.この場合、Object.defineProperty()メソッドを呼び出して、writable以外の特性を修正すると、エラーが発生します.var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Nicholas"
});
//
Object.defineProperty(person, "name", {
configurable: true,
value: "Nicholas"
});
つまり、Object.definePropertyを何度も呼び出して、同じ属性を修正することができますが、configrableの特性をfalseに設定すると制限があります.Object.defineProperty()メソッドを呼び出した場合、configrable、enumerable、およびwritable特性のデフォルト値はfalseです.多くの場合、Object.defineProperty()方法が提供するこれらの高級機能を利用する必要がないかもしれない.しかし、これらの概念を理解することはJavaScriptオブジェクトを理解するために非常に有用である.
2.アクセス器のプロパティ
アクセス属性にはデータ値が含まれていません.それらは一対の子供ゲッターとセッター関数を含んでいます.アクセス属性を読み込むと、getter関数が呼び出されます.この関数は有効な値を返します.アクセス属性を書き込みすると、setter関数を呼び出して新しい値を入力します.この関数はデータの処理方法を決定します.アクセス器のプロパティは以下の4つの特性があります.
[[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、または属性をデータ属性に変更することができますか?オブジェクトに直接定義された属性に対して、この特性のデフォルト値はtrueです.
[[Enumerable]:for-iを循環して属性に戻れるかどうかを示します.オブジェクトに直接定義された属性に対して、この特性のデフォルト値はtrueです.
[[Get]:属性の読み込み時に呼び出す関数です.デフォルトはundefinedです.
[[Set]:属性を書き込む時に呼び出す関数です.デフォルトはundefinedです.
アクセス器のプロパティは直接定義できません.Object.defineProperty()を使用して定義しなければなりません.次の例を見てください.
var book = {
_year: 2004,
edition: 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;
alert(book.edition); //2
以上のコードはbookオブジェクトを作成し、二つのデフォルトの属性を定義します.yearとエディション._yearの前の下線は、対象方法だけでアクセスできる属性を示すためによく使われている記号です.アクセサ属性yearはgetter関数とsetter関数が含まれています.getter関数は_に戻りますyearの値、setter関数は計算によって正確なバージョンを決定します.ですから、year属性を2005に変更すると、_を招きます.yearは2005になり、editionは2になります.これはアクセサ属性を使用する一般的な方法で、属性の値を設定すると他の属性が変化します.3、属性の特性を読み取る
ECMAScript 5のObject.getOwn PropertyDescriptor()方法を使用して、与えられた属性の記述子を取得することができます.この方法は、属性があるオブジェクトとそのディスクリプタの属性名を読み出す2つのパラメータを受信します.戻り値はオブジェクトです.アクセス属性であれば、このオブジェクトの属性はconfigurble、enumerable、get、setがあります.データ属性であれば、この対象の属性はconfigrable、enumerable、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");
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
データのプロパティ_year、valueは最初の値で、configrableはfalseで、getはundefinedに等しいです.アクセス属性yearに対して、valueはundefinedに等しく、enumerableはfalseであり、getはgetter関数を指すポインタである.
著作権声明:本文は小平果のオリジナル文章で、転載は明記してください.http://blog.csdn.net/i10630226
転載先:https://www.cnblogs.com/dingxiaoyue/p/4948232.html