JSのObject.assign()、Object.create()、Object.defineProperty()

4824 ワード

1.Object.assign()
まず関数の定義を見ます.
  関数パラメータは、最終的な戻り値として対象となり、ソースオブジェクト(ここでは任意の複数)となります.この関数を呼び出すことにより、列挙可能な自己属性値をすべて対象オブジェクトにコピーすることができます.Object.assign(targt,…sources)
ここで強調したい3つの点は、
  • エニュメレーションされ得る属性:JavaScriptにおいて、オブジェクトの属性はエニュメレーション可能とエニュメレーション不能とに分類され、属性のenumerable値によって決定される.エニュメレーションは、この属性がfor...inによって検索されるかどうかを決定します.jsにおける基本包装タイプのプロトタイプの属性は列挙できないものであり、Object、Aray、Numberなどのように、もしこのようなコードを書いたらfor...inを使ってその中の属性を遍歴すれば、何も発生しなくなります.間違いなく続けて実行できます.直接ジャンプしていくように見えます.オブジェクトが列挙できない場合、方法for…in JSON.stringify() Object.keys()はいずれも無効になる.
  • には属性があります.プロトタイプの属性とは別に、プロトタイプのチェーンから継承されたものではありません.例えば、function Obj(){this.z=3;/自己属性}/オブジェクトはプロトタイプの属性Obj.prototype.x=1を継承します.プライベート属性以外のObj.prototype.y=2;/非プライベート属性
  • stringまたはSymbolタイプは、直接
  • に割り当てることができます.
    例1:
    var o1 = { a: 1 };
    var o2 = { b: 2 };
    var o3 = { c: 3 };
    
    var obj = Object.assign(o1, o2, o3);
    console.log(obj); // { a: 1, b: 2, c: 3 }
    console.log(o1);  // { a: 1, b: 2, c: 3 }, target object itself is changed.
    この例は、Object.assignが新たなスティッチングの値を返すだけでなく、最初のパラメータの値も変更されることを示している.
    var obj = Object.create({ foo: 1 }, { // foo is an inherit property.
      bar: {
        value: 2  // bar is a non-enumerable property.
      },
      baz: {
        value: 3,
        enumerable: true  // baz is an own enumerable property.
      }
    });
    
    var copy = Object.assign({}, obj);
    console.log(copy); // { baz: 3 }  
    この例では、オブジェクトobjはObject.create()を使用して構成されているので、{foo:1}はobj継承のプロトタイプであり、obj中の第二の属性明示的な宣言はエニュメレーション可能であり、最後にcopyでコピーされた属性はbazだけである.
    2.Object.creat()
     はE 5において提案された新しいオブジェクト作成方式であり、最初のパラメータは継承されるプロトタイプであり、サブ関数でない場合はnullを送ることができ、第二のパラメータは対象の属性記述子であり、このパラメータは任意である.
    function Car (desc) {
        this.desc = desc;
        this.color = "red";
    }
    
    Car.prototype = {
        getInfo: function() {
          return 'A ' + this.color + ' ' + this.desc + '.';
        }
    };
    //instantiate object using the constructor function
    var car =  Object.create(Car.prototype);
    car.color = "blue";
    alert(car.getInfo());
    データのプロパティ
  • writable:任意で書いてもいいですか?
  • configrable:削除できるかどうか、
  • に修正できるかどうか
  • enumerable:for inでエニュメレーションできるかどうか
  • value:値
  • アクセスのプロパティ:
  • get():アクセス
  • セット():設定
  • newObj = Object.create(obj,{
                t1:{
                    value:'yupeng',
                    writable:true
                },
                bar: {
                    configurable: false,
                    get: function() { return bar; },
                    set: function(value) { bar=value }
                }
    
            })
    3.Object.defineProperty()
    詳細はここにあります