Object.definePropertyまたはコードを少し改善する方法

Object.defineProperty(およびObject.defineProperties)のような素晴らしい関数に、この短いポストノートまたは温度のナンセンス(オデッサでは寒くなった、はい)を捧げたいと思います。 現在実装しているプロジェクトで古いブラウザ(IE8を含む)をサポートする必要がないため、約2か月間積極的に使用しています(en望)。



habrの記事がそうであるように、私はそれが何をするのか簡単な説明をします。 Object.definePropertyは、通常のプロパティに対していくつかの非標準的な動作を持つ新しいプロパティを追加し、3つの引数を取ります。



記述子には、次のプロパティが含まれる場合があります。



内容

//    MDN var o = {}; Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable : true}); var bValue; Object.defineProperty(o, "b", {get : function(){ return bValue; }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true});
      
      







MDN オブジェクト/ definePropertyは私をよりよく説明します。 幸いなことに、あなたは英語を知る必要すらないので、すべてが明確です。



一度に複数のプロパティを定義する必要がある場合は、Object.definePropertiesを使用できます。このプロパティは、変更が必要なオブジェクトとキーが定義されたオブジェクトの2つの引数を取ります。

MDN: Object / defineProperties



内容

 //    MDN Object.defineProperties(obj, { "property1": { value: true, writable: true }, "property2": { value: "Hello", writable: false } // etc. etc. });
      
      









今塩。 何を投稿することにしましたか?



上記のプロジェクトでは、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 ); //  jQuery ,      }, each: function( callback ) { return $.each( this, callback ); //  } });
      
      







 o.extend({c: 3}); //       o.each(function( key, value ) { //    $.each,      });
      
      







新しいプロパティを無限に追加することができます。誰もあなたの手を噛まないでしょう。



おわりに


Dandyをプレイし、Javascriptで記述してください。



(タイプミスや不正確さに気付いた場合は、個人的に連絡してください)



All Articles