1。知識保護区:
1。属性名を列挙する関数:
(1)for ... in:ループ本体のオブジェクト内のすべての列挙可能なプロパティ(独自のプロパティと継承されたプロパティを含む)を通過できます。
(2)object.keys():配列(列挙属性)を返します
(3)object.getownPropertyNames():すべてのプロパティ
3。属性のプロパティ:データ属性とアクセサア属性
(1)データ属性:書き込み可能な列挙性設定可能な値
データ属性の単純な値は1つだけです。
(2)アクセサリ属性:write(set)、read(get)、列挙可能、構成可能
アクセサリーは書き込み可能ではありません(つまり、書き込み可能な機能はありません)。
属性に設定されたメソッドがある場合、この属性は書き込み可能であり、GETメソッドがあります。この属性は読み取り可能です。
4。属性プロパティを定義する方法:object.defineProperty(オブジェクト、属性、記述子オブジェクト)
5.プロパティの記述子オブジェクトを取得:object.getownPropertyDescriptor(object、Property)
2。例
1。for ... inの使用によると、「継承」をシミュレートする方法を書くことができます。
<script type = "text/javascript"> var child = {}; var mother = {name: "zhangzhiing"、lastage:21、sex: "female"};関数拡張(ターゲット、ソース){for(var p in source){ターゲット[p] = source [p]; }ターゲットを返します。 } extend(子、母); console.log(child); // <strong> object {name: "zhangzhiing"、lastage:21、sex: "female"} </strong> </scrip>2。プロトタイプオブジェクトのプロパティをループして、空のオブジェクトに1つずつ値を割り当てるためにINを使用して、「継承」を実現します。このアイデアは非常に正しいです。上記の例を変更しましょう。
<script type = "text/javascript"> var child = {}; var mother = {name: "zhangzhiing"、lastage:21、<strong> set age(value){this.lastage = value; }、get age(){return this.lastage+1; }、</strong> sex: "female"}; <br> <strong> mother.age = 15; </strong> // writable関数拡張(ターゲット、ソース){for(var p in source){ターゲット[p] = source [p]; }ターゲットを返します。 } extend(子、母); console.log(child); // <strong> object {name: "zhangzhiing"、lastage:15、age:16、sex: "female"} </strong> </script>コードで一対のセットが使用されていることがわかります。年齢はアクセサ属性です。
実行の結果:セットを含めない通常のオブジェクト、get。
結論:for inが実装した「継承」は、セットとgetを処理しないため、アクセサア属性(年齢)を静的データ属性に変換します。
3.マザーオブジェクトのデータ属性を設定します
<script type = "text/javascript"> var child = {}; var mother = {name: "zhangzhiing"、lastage:21、set age(value){this.lastage = value; }、get age(){return this.lastage+1; }、セックス:「女性」}; object.defineProperty(母、 "lastage"、{writable:false}); // Lastageを書くことができないように設定します。Age= 15; // lastageの値が変化しないままであるため、無効な設定は無効であり、lastage+1は変化しないままです。つまり、年齢は変化しない機能のままです(ターゲット、ソース){for(var p in source){ターゲット[P] =ソース[P]; }ターゲットを返します。 } extend(子、母); console.log(child); // object {name: "zhangzhiing"、lastage:21、age:22、sex: "female"} child.lastage = 12; //結果は、Lastageが変化し、child.lastageがmother.lastageの特徴を「継承」しないことを示していることを示しています。 getownPropertyDesriptor()メソッドを使用して、<br> console.log(object.getoを確認しましょう<em id = __ mcedel> </script> </em>
結論:継承を達成するには、問題を解決する必要があります - > 「継承」属性の特性を解決する必要があります。
4。完全なバージョン
<script type = "text/javascript"> var child = {}; var mother = {name: "zhangzhiing"、lastage:21、set age(value){this.lastage = value; }、get age(){return this.lastage+1; }、セックス:「女性」}; object.defineProperty(母、 "lastage"、{writable:false}); mother.age = 15; <span style = "color:#333399"> <strong>関数拡張(ターゲット、ソース){var names = object.getownpropertynames(source); //(var i = 0; i <names.length; i ++)のすべてのプロパティ名を取得します{if(names [i] in target)継続; //このプロパティが存在する場合、スキップします(プロトタイプ継承では、独自のプロパティとプロトタイプオブジェクトのプロパティが重複している場合、独自のプロパティを保持します) // mother属性の記述子オブジェクト(つまり、es5の記述子オブジェクトで表される属性特性のセット)を取得します。 //母親の記述子オブジェクトを子供の属性定義に取得}ターゲットを返します。 } </strong> </span> extend(子、母); console.log(child); child.lastage = 12; console.log(object.getownPropertyDescriptor(child、 "lastage")); console.log(child); </script>最終結果:
印刷を3回明確に見ることができます。子供は「継承」して設定して取得します。
概要:最近「JavaScriptの権威あるガイド」を読んでいます。いくつかの経験を要約します。間違いがある場合は、私を修正して一緒に学び、進歩を遂げてください〜
関数を使用したJavaScriptの継承の上記の詳細な説明は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。