Object.defineProperty

2235 ワード

Object.definePropertyを覚えてください.getとsetの2つの属性だけではないですよ.
属性:
  • configrable:この属性のconfigrableのキー値がtrueである場合にのみ、この属性の記述子は変更され、対応するオブジェクトから削除されることができる.デフォルトはfalseです
  • enumerable:この属性のenumerableキー値がtrueである場合にのみ、この属性はオブジェクトのエニュメレート・属性に現れます.デフォルトはfalseです
  • この属性に対応する値.任意の有効なJavaScript値(数値、オブジェクト、関数など)とすることができます.デフォルトはundefinedです.
  • writable:この属性のwritableキーの値がtrueである場合、属性の値、つまり上のvalueは、演算子によって変更されます.デフォルトはfalseです
  • getとset.
  • configrableは少し変態です.主に言ってください.
    var b = Object.creat(null);
    Object.defineProperty(b, "a", {
      configurable: true,
      writable: false,
      value: "fuck"
    });
    
  • configrableがtrueである場合、この属性は「設定可能」と「削除可能」を表します.設定されているという意味では、definePropertyを使って再設定することもできます.削除された意味はdelete b.aという属性を使用することができます.
  • configrableがfalseであるとき、面白いところが来ました.まず「削除してはいけません」は肯定的です.「設定されていますか?」この時、もしwritableがtrueであれば、writableとvalueだけ設定できます.writableはtrueからfalseに変えることができますが、falseからtrueに変えることはできません.この時writableがfalseであれば、すべての行為はもう変えられません.Object.definePropertyを呼び出したらエラーが発生します.
  • まとめ:configrableがfalseの場合、writableはtrueからfalseに変えることができますが、falseからtrueに変えることはできません.他の行動は全部修正できません.
    適用:
    まず、object.preventExtensions(...)を紹介します.個人的にはこの方法は単独で使うものはないと思います.この方法を使用すると、オブジェクトは確かに拡張できませんが、既存の属性TMDは削除されます.
  • シール:Object.seal()は、実際には既存のオブジェクトにobject.preventExtensions(...)を呼び出し、既存の属性をすべてconfigrable:falseとしてマークするシールのオブジェクトを作成します.従って、密封後は、新たな属性を追加することができないだけでなく、既存の属性を再構成または削除することもできない(属性の値を変更できるが)
  • .
  • 凍結:Object.freeze()は、実際にはある既存のオブジェクトにObject.seal()を呼び出し、既存の属性をすべてwritable:falseとしてマークして、その値を変更することができません.オブジェクトを深く凍結することができます.具体的な方法は、まずこのオブジェクトにObject.freeze()を呼び出し、その後、参照されたすべてのオブジェクトを巡回し、これらのオブジェクトにObject.freeze()を呼び出すことです.
  • 補足:私たちは普段var a = {}で定義しているオブジェクトを使っていますが、configrable、enumerable、writableのデフォルト値はすべてtrueです.valueはあなたの設定した値です.設定しないとundefinedです.
    参考:
  • MDN
  • 深浅浅出Object.defineProperty()