[JavaScript]Object.create

1973 ワード

使い方
Object.create(proto, [ propertiesObject ])
この方法は、プロトタイプと特定の属性を持つオブジェクトを作成します.
(1)protoのオブジェクトは、新規作成対象の原型となる.
注:protoパラメータがnullまたはオブジェクト値でない場合、TypeErrorが例外となります.
(2)propertiesObjectは任意である.このパラメータオブジェクトは属性と値のセットであり、オブジェクトの属性名は新たに作成されるオブジェクトの属性名であり、値は属性記述子(これらの属性記述子の構造はObject.defineProperties()の2番目のパラメータと同じ)である.
注:propertiesObjectundefinedではなく、オブジェクト自体が持つエニュメレート・属性だけが有効であり、プロトタイプチェーン上の属性は無効である.
var a=Object.create(null);    //    __proto__ null   
var b=Object.create(Object.prototype);    //   new Object,     {}

var base={
    v:1
};
var sub=Object.create(base);    // sub.__proto__===base,    
console.log(sub.v);    //1

var obj=Object.create(Object.prototype,{
    v:{
        configurable:true,
        enumerable:true,

        writable:true,
        value:1
    }
});
注:(1)configurable===falseの場合は、configurableおよびenumerableを変更することはできません.writabletrueからfalseに変更することができますが、falseからtrueに変更することはできません.valueが変更できるかどうかはwritableによる.
(2)writable===false obj.vの再割当は、エラーが発生しないだけである.
(3)オブジェクトの属性記述子には、データ記述子とアクセス記述子の2つの形態があります.
   :
configurable:false              
enumerable:false           

     :
writable:false                
value:undefined      

     :
get:undefined          
set:undefined          
(4)Object.definePropertyは、副作用があるとobjを変更するが、変更後の同じobjオブジェクトを返します.
var obj2=Object.defineProperty(obj,'v',...)
obj2===obj
(5)Object.getPrototypeOfを使用してオブジェクトのプロトタイプを取得することができる(__proto__に相当)
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto
参照
MDN:Object.creat MDN:Object.get ProttypeOf