次のコードを検討してください:
var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});
各オブジェクトが異なる方法で作成されているため、obj1
との間に違いはありますか?obj2
次のコードを検討してください:
var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});
各オブジェクトが異なる方法で作成されているため、obj1
との間に違いはありますか?obj2
このコードでobj1
とを比較してみましょう:obj2
var target1 = {}, target2 = {};
var obj1 = Object.create(target1, {myProp: {value: 1}});
var obj2 = Object.assign(target2, {myProp: 1});
プロトタイプチェーン
Object.create
指定された [[Prototype]] で新しいオブジェクトを作成し、Object.assign
指定されたオブジェクトにプロパティを直接割り当てます。
obj1 !== target1;
obj2 === target2;
との典型的なチェーンは次のようにobj1
なります。obj2
obj1 --> target1 --> Object.prototype --> null
obj2 --------------> Object.prototype --> null
プロパティ
Object.create
プロパティを定義し、Object.assign
それらを割り当てるだけです。
プロパティを作成すると、割り当てによって、構成可能、書き込み可能、および列挙可能として作成されます。プロパティを定義するときに、これらのフラグを指定できますが、デフォルトでは、構成可能でも、書き込み可能でも、列挙可能でもありません。
Object.getOwnPropertyDescriptor(obj1, 'myProp');
// { value: 1, writable: false, enumerable: false, configurable: false }
Object.getOwnPropertyDescriptor(obj2, 'myProp');
// { value: 1, writable: true, enumerable: true, configurable: true }