31

次のコードを検討してください:

var obj1 = Object.create({}, {myProp: {value: 1}});
var obj2 = Object.assign({}, {myProp: 1});

各オブジェクトが異なる方法で作成されているため、obj1との間に違いはありますか?obj2

4

4 に答える 4

47

このコードで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 }
于 2016-01-17T12:32:44.233 に答える