ECMAScript5の紹介
まず第一に、ecmascriptは神maであることを理解する必要があります。 JavaScriptまたはLivescriptはもともとNetscapeによって作成されたことがわかっており、その後のMicrosoftもJScriptを作成するためにフォローアップしました。 Scripteaseには独自のCenviもあります。このようにして、ブラウザスクリプトの3つのバージョンが独自のものを実行します。誰もがこの混oticとしていることを理解しているため、標準化の問題は議題にかけられています。 1997年、JavaScript1.1に基づく提案は、欧州コンピューターメーカー協会(欧州コンピューターメーカーがセクター)に提出されました。最後に、ECMAScriptと呼ばれる新しいスクリプト言語標準であるECMA-262を開発しました。翌年、ISO/IEC(国際標準化および国際電気技術委員会)も標準としてECMAScriptを採用しました。その後、世界は平和になります。主要なブラウザメーカーは、JavaScriptのそれぞれの実装の基礎としてECMAScriptを使用しています。もちろん、それは単なる基盤であり、完全に従っていません。そうしないと、ブラウザの互換性の問題はそれほど多くありません。
ecmascript5とは何ですか?名前が示すように、これはこの奇妙なものの5番目のバージョンであり、iPhone5。EcMascript3のように、私たちがよく使用しているのと同じように、おもちゃではなく本当のプログラミング言語と見なされ、非常に人気があります。
文章:
私は常にGet/Setを誤って理解していましたが、Get Setはオブジェクト属性メソッドだと思います。他の人のブログを読んだ後、私は多くの質問がありました。今日、システムは多くのテストを行い、ついにそれを理解しました。 (読書と書き込みのデモテストに自分で合格した場合、間違っている場合は、私を批判して修正することを歓迎します)
GET/セットアクセターはオブジェクトのプロパティではなく、プロパティのプロパティです。誰もがはっきりと区別する必要があります。機能は内部でのみ使用されるため、JavaScriptで直接アクセスすることはできません。特性が内部値であることを示すために、[[値]]などの2つのチーム間の括弧内に囲まれています。
1.属性のこれらの特性を簡単に紹介しましょう(ここに簡単な承認があります)
(1)データ属性 - データ値を含む位置。この位置は、値を読み書きできます。
データ属性には、その動作を説明する4つの特性があります。
[[構成可能]]:構成できますか?
[[列挙可能]]:列挙できますか?
[[writable]]:読みやすいですか
[[値]]:属性値
(2)Accessor属性属性 - データ値は含まれておらず、ゲッターとセッターの関数が含まれています(これら2つの機能は必要ありません)
アクセサーのプロパティには、その動作を説明する4つの特性もあります。
[[構成可能]]:構成できますか?
[[列挙可能]]:列挙できますか?
[[get]]:属性を読むときに呼び出される関数、デフォルトは未定義です
[[set]]:属性を作成するときに呼び出される関数、デフォルトは未定義です
2。ここでは、[[[Get]]]/[[set]]の紹介に焦点を当てています。
まず、本に記載されているGET/セットアクセターの行動特性について説明しましょう。Get/Setアクセサーは、定義なく読み書きできます。 1つだけを定義することもできます。 GETのみが定義されている場合、記載されている属性は読み取り可能であり、書き込みはできません。セットのみが定義されている場合、説明されている属性は書き込みできず、読み取りできません。
(1)元のGETセット方法は次のとおりです。
function foo(val){var value = val; this.getValue = function(){return値;}; this.setValue = function(val){value = val;};} var obj = new foo( "hello"); alert(obj.getValue(); // "hello" obj.setvalue( "hi"); alert(obj.getValue();上記のコードは、閉鎖範囲を使用して実装されたGET SETメソッドです。メソッドは、属性プロパティではなく、インスタンスオブジェクトの属性メソッドであることに注意してください。定義されていない場合、値値にアクセスできません
function foo(val){var value = val;/* this.getValue = function(){return値;}; this.setValue = function(val){value = val;};*/} var obj = new foo( "hello"); alert(obj.value); // redefined次の例は、属性プロパティではなく、オブジェクトの属性方法もあります。
var obj = {name: "john"、get:function(){return this.age;} // getのみが定義され、セットは定義されていませんが、年齢//ここで定義されているメソッドは、属性のget、set属性に影響しない場合でも、読み取り、書き込み、名前の属性を付けます。通常のオブジェクト属性}; alert(obj.name); // john readable obj.name = "jack"; // writable alert(obj.name); // jack(2)アクセサー属性のプロパティとしてアクセサを取得/設定します。
繰り返しますが、それはオブジェクトの属性ではなく、属性を読み書きできるかどうかを決定します。設定されていない場合は、正常に読み書きしているように、それは大丈夫です(プロパティは読み取ったり読んだりすることができます
プロパティ自体へのアクセスを書き、読み取り、書き込みます)
GET /セット属性を変更するには2つの方法があります。
a。 object.defineProperty()を使用します
var object = {_ name: "daisy"}; object.defineProperty(object、 "name"、{//ここでのメソッド名は、名前のプロパティが定義されることを意味します(したがってobject.nameを介してアクセスできるように)、ゲッターアクセサのみが定義されます。 this._name;}}); alert(object.name); // "daisy" object.name = "jack"; //ゲッターアクセサのみが定義されているため、書き込みは無効なアラート(object.name); // "daisy" object.name = "jack";Object.defineProperty(object、pro、{})のプロパティ名は、object.proでアクセスされるプロパティに対応する必要があることに注意してください。
b。 Get Setキーワードを使用します。
var object = {_ name: "daisy"、get name(){//ここでのメソッド名は、名前属性が定義されることを意味します(したがってobject.nameからアクセスできる)、ゲッターアクセサのみが定義され、[[値]]値は定義されていません。 return this._name;} // get、setメソッドは属性のプロパティであり、オブジェクトメソッドではなく、属性を読み取りおよび書き込みできるかどうかを決定する}; Alert(object.name); // Daisyここでアンダースコアを削除する方法はデイジーです。さらに、undefinedobject.name = "jack"; //ゲッターアクセサのみが定義されているため、読み取ることができますが、書き込みアラート(object.name); // daisy上記の2つの方法は同等です。上記の2つのメソッドの両方に、オブジェクトオブジェクトに2つの属性があることに注意してください:_NAME(初期値)名前(初期値なし)。これはブラウザコンソールを介して見ることができます。
では、この名前の属性はいつ本当に定義されていますか? object.defineProperty(object、pro、{})がオブジェクトの新しいプロパティプロを定義できることを知っています。 get pro(){}/set pro(){}およびobject.defineProperty(object、pro、{})が同等であるため、新しいプロパティプロも定義されます。これが、オブジェクトに2つのプロパティがある理由です。
(3)この記事のJavaScriptのGet And Set Accessorの実装コード:標準標準のGet and Set Accessorsの実装に関連:合理的な思考
私は自分で例を書きました
function foo(val){this.value = val; //値属性は定義され、no _value} foo.prototype = {set value(val){//メソッド名と属性名は同じであることに注意してください。プロトタイプで定義されていますthis._value;}}; //アクセサーは返品して設定します。それらは両方とも_nameであり、ここには定義はありません。なぜそれを読んだり書いたりすることができるのですか? ? ? ? var obj = new foo( "hello"); alert(obj.value); // "hello" obj.value = "yehoo";アラート(obj.value); // "yehoo"上記の質問を解決するために、多くのテストが行われました。それを一つずつ見てみましょう。
まずこの例を見てください。 GET機能のみがプロトタイプで定義されています。 obj.valueで値属性を読み取るときは、それなしでインスタンスでそれを探してから、プロトタイプで見つけます。 GETメソッドは呼び出されます。
function foo(val){this._value = val; //ここの属性は下線に描かれており、_value属性の初期化、_value属性は読みやすく書かれている} foo.prototype = {// set value(val){//メソッド名は属性名と同じであることに同じ属性属性であることに注意してください。 }、get value(){//メソッド名は属性名と同じで、value属性を定義し、プロトタイプのget属性をreturn this._value;}}; var obj = new foo( "hello"); alert(obj.value); // helloプロトタイプの値にアクセス属性obj.value = "yehoo"; //名前属性のget属性のみを定義しているため、読み取ることはできますが、書かれていません。書き込みは無効なアラート(obj.value); //こんにちはof._valueがコンストラクターのアンダースコアから削除された場合、プロトタイプで定義されている値属性がGET属性を定義します。値属性の読み取りと書き込みを制御できます。言い換えれば、obj.valueが属性にアクセスすると、GETメソッドが呼び出され、最初にオブジェクト自体で検索しても、プロトタイプで検索します。何もなければ、それは未定義と見なされます。デフォルトは読みやすく、書き込み可能です。
function foo(val){this.value = val; //値の取得機能のみがプロトタイプで定義されているため、ここでの書き込みは無効です} foo.prototype = {// set value(val){//メソッド名と属性名は同じであることに注意してください。値が手動で記述されていても、GETメソッドがthis._valueを返すため、値を正しく読み取ることができないため: "hah" // value(){//メソッド名は属性名と同じです。値属性とそのGET属性は、プロトタイプで定義されます。 this._value;}}; var obj = new foo( "hello"); // "hello"は正常に記述されていません(obj.value); //未定義obj.value = "yehoo";上記の例が読みやすく、書くことができないことを証明するために:手動で_value: "hah"を書くと、値を読むことができますが、それを書くことはできません。
function foo(val){this.value = val; //値の取得機能のみがプロトタイプで定義されているため、ここでの書き込みは無効です} foo.prototype = {// set value(val){//メソッド名と属性名は同じであることに注意してください。値が手動で記述されていても、GETメソッドがthis._valueを返すため、値を正しく読み取ることができないため: "hah" // value(){//メソッド名は属性名と同じです。値属性とそのGET属性は、プロトタイプで定義されます。 this._value;}}; var obj = new foo( "hello"); // "hello"は正常に書かれていませんでした。値:「hah」が手動で書かれている場合、値の値を読むよう努力できますか? GETメソッドによって返されるthis._valueは定義されていないため、obj.valueは値を読み取り、value(){}メソッドをcallingにcallしますが、値はまだ記述できません。
function foo(val){this.value = val; //値の取得機能のみがプロトタイプで定義されているため、ここでの書き込みは無効です} foo.prototype = {// set value(val){//メソッド名と属性名は同じであることに注意してください。 GETメソッドがthis._valueを返すため、値は手動で記述されます。 value(){//メソッド名と属性名は同じです。値属性とそのGET機能は、プロトタイプで定義されています。 this._value;}}; var obj = new foo( "hello"); // "hello"は正常にアラート(obj.value); // undefined read read read read read read read read read recod return this._value、so undefinedobj.value = "yehoo";アラート(obj.value); //未定義この例を見ると、get setは定義されていますが、this._valueは定義されていません。値を読み取り、書き込み可能であることがわかります。プロトタイプのGet Setメソッドを削除すると、読みやすいまたは書き込みます
function foo(val){this.value = val;} foo.prototype = {set value(val){this._value = val;}、get value(){return this._value;}}; var obj = new foo( "hello"); alert(obj.value); // hello obj.value = "yehoo"; alert(obj.value); // yehoo function foo(val){this.value = val;} //それは通常と同じです。 foo( "hello"); alert(obj.value); // hello obj.value = "yehoo"; alert(obj.value); // yehoo要約します
get pro(){}属性のみが読み取り可能で、書き込みはありません。
set pro(){}属性を書き直して読み取れないと宣言します。
宣言が宣言されていない場合、属性は読みやすく書かれています。
すべての宣言が行われた場合は、Get Setで定義された方法に従って読み取りおよび書き込みを行います。
すべてが宣言されているが、定義された読み取りと書き込み方法を正しく読み書きできない場合、get/setは失敗します。読み取り可能で書き込み可能なデフォルトになります
プロトタイプで定義されている値属性は、GET属性を定義します。値属性の読み取りと書き込みを制御できます。言い換えれば、obj.valueが属性にアクセスすると、GETメソッドが呼び出され、最初にオブジェクト自体で検索し、次にプロトタイプで検索します。何もない場合、それは未定義と見なされます。デフォルトは読みやすく、書き込み可能です。
補充:
pro(){}/set pro(){}をset {}またはobject.defineProperty(object、pro、{get:function(){return this._name;}})を使用するかどうか。PROはこれを返すことと同じではありません。そうしないと、次のエラーが報告されます:(理由がわかりません、それは私自身の呼び出しによって引き起こされるスタックオーバーフローのようです)
マスターの修正の後、ここでエラーが報告される理由を理解します。This.Valueがget value(){}メソッドで返される場合、GET値の方法が再び呼び出され、したがってデッドループに落ち、メソッドスタックがオーバーフローします。