オブジェクトオブジェクト

12613 ワード

参考資料 https://opentutorials.org/course/743/6578
オブジェクトはオブジェクトを表し、「オブジェクトオブジェクト」は何ですか?
JavaScriptでは、オブジェクトオブジェクトオブジェクトはJavaScript内のすべてのオブジェクトの最上位の親を表します.
JavaではObjectクラスが最上位クラス...JAvascriptを知れば知るほどjavaに似た一面が見えます.

オブジェクト使用時の動作原理


Objectオブジェクトのメソッドは2つあります.
(MDNで確認できます.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)


上記の例に示すように、Object.メソッド()、オブジェクト.prototype.メソッド()は、このようなタイプに分けられます.
上記の例のObject.keys(), Object.prototype.TOString()構文を表示します.
<script>

//Object.keys()
	
    let arr = ["a", "b", "c"];
    console.log('Object.keys(arr):', Object.keys(arr))
    
    // Object.keys() 는 매개변수로 전달된 객체의 key값만을(value제외) 뽑아낸다.
    // 배열도 객체에 해당하고 따라서 Object.keys(arr)의 결과는 배열의 key값인 인덱스 0, 1, 2 가 출력된다.
//-----------------------------------------------------------    
//Object.prototype.toString()
    
    let o = new Object();
    console.log('o.toString()', o.toString());
    
    // [object Object] 라는 값이 String 타입으로 반환된다. 해당 객체가 Object라는 것.
    
</script>
最初に見た二人の違いはkeys()は、オブジェクトのプロパティkeysメソッドを呼び出し、オブジェクトをパラメータとして渡します.
.prototype.toString()は、パラメータとして出力するオブジェクトをパラメータとしてオブジェクトオブジェクトに渡すプロパティメソッドではなく、サブオブジェクト(オブジェクトインスタンスを宣言する変数o)からオブジェクトのプロトタイプを継承して使用します(o.toString().
まず対象です.keys()の例では
let o = new Object(); この部分からオブジェクトがコンストラクション関数であることがわかります.
また,JavaScriptでは関数がオブジェクトであるため,property(属性)を持つことができる.
すなわち,Objectという構造関数におけるproperty keysメソッドを呼び出す.
Object.prototype.toString()は、上記の説明を参照してください.
オブジェクトオブジェクトのtoString()メソッドには、次のものがあります.
動作原理は、トップオブジェクトオブジェクトのpropertyであるprototypeのproperty、すなわちtoString()メソッドを呼び出すことである.

オブジェクトを展開


オブジェクトオブジェクトは最上位の親オブジェクトであるため、オブジェクトが持つ属性サブオブジェクトはすべて使用できます.
したがって、すべてのオブジェクトで機能を使用する場合は、オブジェクトオブジェクトを展開し、必要な機能を属性としてオブジェクトに追加できます.
たとえば、パラメータとして渡された値をブール型として返されるcontain関数としてオブジェクトに含めるかどうかをすべてのオブジェクトに使用できるようにする場合は、contain関数を属性としてObjectオブジェクトに追加できます.
<script>

	Object.prototype.contain = function(needle){
    	for(let name in this) {
        	if(this[name] === needle){
            	return true;
            }
        }
        return false;
    }

</script>
ただし、拡張オブジェクトは使用できません.
オブジェクトオブジェクトがすべてのオブジェクト(サブオブジェクト)に影響するためです.
極端な例として、contain関数を任意にオブジェクトに追加すると、~in反復文でオブジェクトが出力され、オブジェクトのプロパティcontainメソッド値が出力されます.
ex)
<script>

  Object.prototype.contain = function(neddle) {
      for(var name in this){
          if(this[name] === neddle){
              return true;
          }
      }
      return false;
  }
  var o = {'name':'egoing', 'city':'seoul'}
  console.log(o.contain('egoing'));
  var a = ['egoing','leezche','grapittie'];
  console.log(a.contain('leezche'));
  
  for(var name in o){
    console.log(name);  
}

// name의 value, contain의 value가 출력된다.

</script>
しかし、このようにオブジェクトを拡張しなければならないなら、仕方がないわけではありません.
<script>

  for(var name in o){
      if(o.hasOwnProperty(name))
          console.log(name);  
  }
  
  // name 을 자기자신의 직접 property로 가지는 o 객체의 name 값만 출력된다.

</script>
以上のようにhasOwnPropertyメソッドを使用してオブジェクトが直接所有するpropertyをフィルタリングし、オブジェクトの値に拡張すると除外された値が得られます.