今、今日、私たちは機能を実装するために拡張してみましょう。
具体的なアイデア:使用Object.defineProperty()の特性は、属性記述子Object.getOwnPropertyDescriptorにより取得し、新しく作成されたオブジェクトに割り当てられた一連の属性、および()
コードを引き出しましょうよ
Object.defineProperty(のObject.prototype、 "拡張" 、 { 書き込み可能:trueに、 可算:falseに、 設定可能:trueに、 値:機能(O){ // すべてのプロパティが所有取得 するvar名= Object.getOwnPropertyNames(O); 用(VARの I = 0; I ++; I <names.lengthの){ // もし属性がスキップ存在する のIF(名前[I] で 、これは)続行。 // 属性記述子のSSの属性を取得 するvar DESC = ; Object.getOwnPropertyDescriptor(O、名前[I]) Object.defineProperty(この、名[I]、DESC) } } } )を
使用例:
// 新しいオブジェクトを定義 するvar A = { :itemA。1 } //は、新しい属性を作成し、属性記述セット Object.defineProperty(A、 "itemB" 、{ 書き込み可能:trueに、 :列挙falseに、 :設定可能な真に、 値: 2 }) // 新しいオブジェクトを定義 するvar B = {} (A)b.extendを // この時点で、我々は、静的プロパティが継承している見ることができる渡さ にconsole.log(B) // 結果{itemA:1、 itemB:2} // も渡されていないプロパティ記述子を見て せextendDesc = Object.getOwnPropertyDescriptor(B、 "itemB" ) はconsole.log(extendDesc) // 结果为{値:2、書き込み可能:真、列挙:偽、設定:真}
さて、最後に、我々はどのようなアナログObject.create()関数を達成するために一緒に仕事をする機会を持っています