JS Object静的方法解説

20108 ワード

一、Object.assign()
複数のオブジェクトのエニュメレート・プロパティーを対象オブジェクトにコピーし、割り当て後のオブジェクトに戻ります.
Object.assign(targt,…sources)
  • target:ターゲット
  • ...sources:ソースオブジェクト
  • テストは以下の通りです
    var source1 = {
      name1: 'source1',
      age1: 18
    };
    
    var source2 = {
      name2: 'source2',
      age2: 19
    };
    
    var target = Object.assign({name: 'target'}, source1, source2);
    
    console.info(JSON.stringify(target)); 
    //     :
    {
        "name":"target",
        "name1":"source1",
        "age1":18,
        "name2":"source2",
        "age2":19
    }
    二、Object.creat()
    クラスのプロトタイプのオブジェクトを取得し、パラメータタイプのプロトタイプのオブジェクトを返します.クラス継承に使用できます.
    Object.creat(proto[propertiesObject])
  • proto:クラス原型
  • テストは以下の通りです
    //   
    function Super1Class() {
      this.name = 'Super1Class';
    }
    
    Super1Class.prototype = {
      super1Method: function() {
        console.info('My name is ' + this.name);
      }
    };
    
    //   
    function MyClass() {
      this.name = 'MyClass';
    }
    
    MyClass.prototype = Object.create(Super1Class.prototype); 
    //          
    // MyClass.prototype = new  Super1Class();
    
    var myClass = new MyClass();
    
    console.info(myClass instanceof Super1Class); 
    // true
    console.info(myClass instanceof MyClass);   
    // true
    console.info(myClass.super1Method()); 
    // My name is MyClass
    三、Object.defineProperties()
    オブジェクトに属性を定義します.属性が存在する場合は、既存の属性を新規に定義して更新します.この属性が存在しない場合は、属性を追加します.
    Object.defineProperties(obj,props)
  • obj:属性が付加されたオブジェクト
  • props:属性オブジェクトを追加または更新する
  • テストは以下の通りです
    var obj = {
      name: 'obj'
    };
    
    Object.defineProperties(obj, {
      name: {
        value: 'newName',
        writable: true
      },
      newProp1: {
        value: 'newProp1',
        writable: true,
        enumerable: true
      },
      newProp2: {
        value: 'newProp2',
        writable: true
      }
    });
    
    console.info(JSON.stringify(obj));
    //       
    {
        "name":"newName",
        "newProp1":"newProp1"
    }
    以上の出力結果から、Object.defineProperties()に定義されたカバー属性nameは、古い属性nameの値とそのwritable属性を更新しただけで、name属性のエニュメレーション性を更新していないことが分かりました.
    しかし、Object.defineProperties()によって定義された新しい属性newProp 2はデフォルトでは列挙できないので、JSON.stingify(obj)においては、この新規定義の属性をプロビジョニングしていません.
    以上の結果から結論が得られます.
    JSON.strigify()JSONObjectには、そのオブジェクトの列挙可能な属性のみがプロビジョニングされます.
    四、Object.defineProperty()
    オブジェクトに新しい属性を定義するか、オブジェクトの既存の属性を変更し、オブジェクトを返します.
    Object.defineProperty(obj,prop,descriptor)
  • obj:属性が付加されたオブジェクト
  • prop:属性名
  • descriptor:属性記述
  • テストは以下の通りです
    var obj = {};
    
    var mame = 'obj';
    Object.defineProperty(obj, 'name', {
      configurable: true,
      enumerable: true,
      get: function() {
        console.info('get name .');
        return mame;
      },
      set: function(newName) {
        console.info('set new name is ' + newName);
        mame = newName;
      }
    });
    
    console.info(JSON.stringify(obj));
    obj.name = 'xxx';
    console.info(JSON.stringify(obj));
    //       :
    get name .
    {"name":"obj"}
    set new name is xxx
    get name .
    {"name":"xxx"}
    以上のテスト結果から、私たちはプログレッシブオブジェクトで属性のgetメソッドを呼び出すことができます.オブジェクト属性に値を割り当てるときは、属性のセット方法を呼び出すことができます.
    五、Object.entries()
    検索対象上のすべてのエニュメレート・属性を巡回して、結果は2次元配列[['key1', 'value1'], ['key2', 'value2'], ......]である.
    Object.entries(obj)
  • obj:遍歴されたオブジェクト
  • テストは以下の通りです
    var obj = {
      name: 'obj',
      age: 18
    };
    
    var kvs = Object.entries(obj);
    
    console.info(JSON.stringify(kvs)); 
    // [["name","obj"],["age",18]]
    
    for(let [key, value] of Object.entries(obj)) {
      console.info(key + ' --> ' + value); 
      // name --> obj, age --> 18
    }
    
    Object.entries(obj).forEach(function([key, value]) {
      console.info(key + ' --> ' + value); 
      // name --> obj, age --> 18
    });
    
    for(let key in obj) {
      console.info('key --> ' + key); 
      // key --> name, key --> age
    }
    六、Object.freeze()
    オブジェクトの属性を凍結し、オブジェクトとそのプロトタイプに追加、削除、属性の更新を阻止します.凍結されたオブジェクトを返します.
    Object.freeze(obj)
  • obj:凍結されたオブジェクト
  • テストは以下の通りです
    'use strict'
    
    var obj = {
      name: 'obj'
    };
    
    obj['age'] = 18;
    obj.name = 'newName';
    
    console.info(JSON.stringify(obj)); 
    // {"name":"newName","age":18}
    
    var o = Object.freeze(obj);
    
    console.info(o === obj); 
    // true
    
    //         
    obj['sex'] = 'man'; 
    // Uncaught TypeError: Cannot add property sex, object is not extensible
    obj.name = 'updateName'; 
    // Uncaught TypeError: Cannot assign to read only property 'name' of object '#'
    
    console.info(JSON.stringify(obj)); 
    // {"name":"newName","age":18}
    凍結されたオブジェクトの属性はすべて読み取り可能です.
    七、Object.getOwn PropertyDescriptor()
    オブジェクト指定の名称の直接属性の記述情報(オブジェクトに直接的な属性であって、プロトタイプチェーン上の属性ではない)を取得し、存在するとその属性の記述情報を返し、存在しない場合はundefinedに戻ります.
    Object.getOwn PropertyDescriptor(Obj,prop)
  • obj:ターゲット
  • prop:取得された属性名
  • テストは以下の通りです
    function Obj() {
      this.name = 'obj';
    }
    
    Obj.prototype = {
      age: 18,
      sex: function() {
        return 'man';
      }
    };
    
    var obj = new Obj();
    
    var descName = Object.getOwnPropertyDescriptor(obj, 'name');
    console.info(JSON.stringify(descName)); 
    // {"value":"obj","writable":true,"enumerable":true,"configurable":true}
    
    var descAge = Object.getOwnPropertyDescriptor(obj, 'age');
    console.info(JSON.stringify(descAge)); 
    // undefined
    
    var descSex = Object.getOwnPropertyDescriptor(obj, 'sex');
    console.info(JSON.stringify(descSex)); 
    // undefined
    八、Object.getOwn PropertyDescriptors()
    オブジェクトの直接属性に関する記述情報を取得します.
    Object.getOwn PropertyDescriptors(Obj)
  • obj:ターゲット
  • テストは以下の通りです
    function Obj() {
      this.name = 'obj';
      this.age = 18;
    }
    
    Obj.prototype = {
      sex: function() {
        return 'man';
      }
    };
    
    var obj = new Obj();
    
    var descObj = Object.getOwnPropertyDescriptors(obj);
    console.info(JSON.stringify(descObj));
    //       
    {"name":
      {
        "value":"obj",
        "writable":true,
        "enumerable":true,
        "configurable":true
      },
      "age":{
        "value":18,
        "writable":true,
        "enumerable":true,
        "configurable":true
      }
    }
    九、Object.getOwn PropertyNames()
    オブジェクトの直接属性の属性名を取得します.属性名文字列配列を返します.
    Object.getOwn PropertyNames(Obj)
  • obj:ターゲット
  • テストは以下の通りです
    function Obj() {
      this.name = 'obj';
      this.age = 18;
    }
    
    Obj.prototype = {
      sex: function() {
        return 'man';
      }
    };
    
    var obj = new Obj();
    
    var objProps = Object.getOwnPropertyNames(obj);
    console.info(JSON.stringify(objProps));
    // ["name","age"]
    十、Object.getOwn PropertySymbors()
    オブジェクト上のすべてのSymbolタイプの属性リストを取得します.
    Object.getOwn PropertySymbors(Obj)
  • obj:ターゲット
  • テストは以下の通りです
    const obj = {
      name: 'obj'
    };
    
    const name = Symbol('name');
    
    obj[name] = '   Symbol     name  ';
    
    var objSymbolProps = Object.getOwnPropertySymbols(obj);
    
    console.info(objSymbolProps);
    // [Symbol(name)]
    console.info(obj[objSymbolProps[0]]);
    //    Symbol     name  
    十一、Object.get ProttypeOf()
    オブジェクトのプロトタイプオブジェクトを取得すると、その機能はobj.uプロト同じです
    Object.get ProttypeOf(Obj)
  • obj:ターゲット
  • テストは以下の通りです
    function MyClass() {}
    
    MyClass.prototype = {
      name: 'MyClass'
    };
    
    var obj = Object.create(MyClass.prototype);
    
    console.info(Object.getPrototypeOf(obj) === MyClass.prototype);
    // true
    
    console.info(obj.__proto__ === MyClass.prototype);
    // true
    十二、Object.is()
    2つのオブジェクトが同じかどうかを比較し、値タイプのオブジェクトの比較値が等しいかを参照タイプのオブジェクトがメモリアドレスと同じかを比較します.
    Object.is(value 1,value 2)
  • value 1:最初の比較対象
  • value 2:第二の比較対象
  • テストは以下の通りです
    Object.is('foo', 'foo');     // true
    Object.is(window, window);   // true
    
    Object.is('foo', 'bar');     // false
    Object.is([], []);           // false
    Object.is({}, {});           // false
    
    var obj1 = {
      name: 'obj'
    };
    
    var obj2 = {
      name: 'obj'
    };
    
    Object.is(obj1, obj1);       // true
    Object.is(obj1, obj2);       // false
    
    Object.is(null, null);       // true
    
    Object.is(0, -0);            // false
    Object.is(-0, -0);           // true
    Object.is(NaN, 0/0);         // true
    十三、Object.keys()
    オブジェクトのエニュメレート・プロパティー配列を返します.
    Object.keys(obj)
  • obj:ターゲット
  • テストは以下の通りです
    var arr = ['a', 'b', 'c'];
    
    console.info(Object.keys(arr));
    // ["0", "1", "2"]
    
    var obj = { 1: 'a', 0: 'b', 2: 'c' };
    
    console.log(Object.keys(obj));
    // ["0", "1", "2"] 
    以上の結果は、Object.keys(obj)が属性名を並べ替えることも見られます.