Object.defineProperty(およびObject.defineProperties)のような素晴らしい関数に、この短いポストノート
または温度のナンセンス(オデッサでは
寒くなった、はい)を捧げたいと思います。 現在実装しているプロジェクトで古いブラウザ(IE8を含む)をサポートする必要がないため、約2か月間積極的に使用しています(en望)。
habrの記事がそうであるように、私はそれが何をするのか簡単な説明をします。 Object.definePropertyは、通常のプロパティに対していくつかの非標準的な動作を持つ新しいプロパティを追加し、3つの引数を取ります。
- 新しいプロパティを追加して変更するオブジェクト
- 実際には追加したいプロパティ(文字列)
- 記述子:アクセサー(ゲッター、セッター)などの新しいプロパティの「設定」を含むオブジェクト
記述子には、次のプロパティが含まれる場合があります。
- 値 (任意の値:文字列、関数...)-オブジェクトの決定されたプロパティが受け取る値(この場合のゲッターとセッターは決定できません)
- 書き込み可能 (true / false)-プロパティの値を上書きすることは可能ですか(アクセサーも利用できません)
- get (関数)-ゲッター(値と書き込み可能は定義できません)
- set (関数)-setter(値と書き込み可能は定義できません)
- 構成可能 (true / false)-ハンドルをオーバーライドできます(同じプロパティでObject.definePropertyを使用)
- enumerable (true / false)-プロパティがfor..inを介して列挙され、Object.keysで使用可能かどうか(不適切な表現)
MDN
オブジェクト/ definePropertyは私をよりよく説明します。 幸いなことに、あなたは英語を知る必要すらないので、すべてが明確です。
一度に複数のプロパティを定義する必要がある場合は、Object.definePropertiesを使用できます。このプロパティは、変更が必要なオブジェクトとキーが定義されたオブジェクトの2つの引数を取ります。
MDN:
Object / defineProperties 。
今塩。 何を投稿することにしましたか?
上記のプロジェクトでは、definePropertyを積極的に使用するだけでなく、非常に積極的に使用する必要があるため、コードは控えめに言ってもくなりました。 最も簡単なアイデアが思い浮かびました(これまで考えたことはなかったでしょうか?)、Objectプロトタイプを拡張して、コードをよりコンパクトにします。 悪いトーンは、オブジェクトプロトタイプに新しいメソッドを散らかすのが悪いと言います。
この意見はどこから来たのですか? すべてのオブジェクトがこのプロパティを継承するため、プロトタイプの通常の変更により、for..inで列挙されます。 上記で説明したこと、つまり列挙可能な記述子のプロパティを考えると、私の心は温かくなります。 実際、この方法でプロトタイプを拡張します。
Object.defineProperty( Object.prototype, 'logOk' { value: function() { console.log('ok') }, enumerable: false });
すべてのオブジェクトはこのメソッドを受け取りますが、同時に列挙不可能です(そのようなプロパティがあるかどうかを確認するために毎回hasOwnPropertyを使用する必要はありません):
var o = {a: 1, b: 2} for( var i in o ) console.log( i, o[ i ] ); > a 1 > b 2 o.logOk(); > ok
実際、私がここにいるのはグラフォマニアックです。
まず、defineメソッドを定義します。これにより、オーバーロードを呼び出すたびに、私の意見では、構築を行いません。 次に、列挙不可能なプロパティでオブジェクトを拡張するextendNotEnumメソッドを定義します。
Object.defineProperties( Object.prototype, { define: { value: function( key, descriptor ) { if( descriptor ) { Object.defineProperty( this, key, descriptor ); } else { Object.defineProperties( this, key ); } return this; }, enumerable: false }, extendNotEnum: { value: function( key, property ) { if( property ) { this.define( key, { value: property, enumerable: false, configurable: true }); } else { for( var prop in key ) if( key.hasOwnProperty( prop ) ){ this.extendNotEnum( prop, key[ prop ] ); } } }, enumerable: false } });
使用法:
var o = { a: 1 }; o.define( 'randomInt', { get: function() { return 42; } }); o.extendNotEnum({ b: 2; }); for( var i in o ) console.log( i, o[ i ] ); > a 1 > randomInt 42 console.log( ob ); > 2
そして彼女は行った...さらに2つの便利な方法:
Object.prototype.extendNotEnum({ extend: function() { var args = Array.prototype.slice.call( arguments ); args.unshift( this ); return $.extend.apply( null, args );
o.extend({c: 3});
新しいプロパティを無限に追加することができます。誰もあなたの手を噛まないでしょう。
おわりに
Dandyをプレイし、Javascriptで記述してください。
(タイプミスや不正確さに気付いた場合は、個人的に連絡してください)